[解決済み] ARGとENV、この場合どちらを使うか?
質問
些細な疑問かもしれませんが ARG と ENV は、私には物事をはっきりさせません。
PHP-FPMコンテナを作っているのですが、ユーザーの必要に応じて拡張機能を有効化/無効化できるようにしたいのです。
Dockerfileに条件文を追加したり、ビルドコマンドでフラグを渡したりして、これを実現できれば最高なのですが、AFAIKではサポートされていません。
私の場合、個人的なアプローチとしては、コンテナの起動時に以下のような小さなスクリプトを実行することにしています。
#!/bin/sh
set -e
RESTART="false"
# This script will be placed in /config/init/ and run when container starts.
if [ "$INSTALL_XDEBUG" == "true" ]; then
printf "\nInstalling Xdebug ...\n"
yum install -y php71-php-pecl-xdebug
RESTART="true"
fi
...
if [ "$RESTART" == "true" ]; then
printf "\nRestarting php-fpm ...\n"
supervisorctl restart php-fpm
fi
exec "$@"
このように私の
Dockerfile
はこのようになります。
FROM reynierpm/centos7-supervisor
ENV TERM=xterm \
PATH="/root/.composer/vendor/bin:${PATH}" \
INSTALL_COMPOSER="false" \
COMPOSER_ALLOW_SUPERUSER=1 \
COMPOSER_ALLOW_XDEBUG=1 \
COMPOSER_DISABLE_XDEBUG_WARN=1 \
COMPOSER_HOME="/root/.composer" \
COMPOSER_CACHE_DIR="/root/.composer/cache" \
SYMFONY_INSTALLER="false" \
SYMFONY_PROJECT="false" \
INSTALL_XDEBUG="false" \
INSTALL_MONGO="false" \
INSTALL_REDIS="false" \
INSTALL_HTTP_REQUEST="false" \
INSTALL_UPLOAD_PROGRESS="false" \
INSTALL_XATTR="false"
RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm \
https://rpms.remirepo.net/enterprise/remi-release-7.rpm
RUN yum install -y \
yum-utils \
git \
zip \
unzip \
nano \
wget \
php71-php-fpm \
php71-php-cli \
php71-php-common \
php71-php-gd \
php71-php-intl \
php71-php-json \
php71-php-mbstring \
php71-php-mcrypt \
php71-php-mysqlnd \
php71-php-pdo \
php71-php-pear \
php71-php-xml \
php71-pecl-apcu \
php71-php-pecl-apfd \
php71-php-pecl-memcache \
php71-php-pecl-memcached \
php71-php-pecl-zip && \
yum clean all && rm -rf /tmp/yum*
RUN ln -sfF /opt/remi/php71/enable /etc/profile.d/php71-paths.sh && \
ln -sfF /opt/remi/php71/root/usr/bin/{pear,pecl,phar,php,php-cgi,phpize} /usr/local/bin/. && \
mv -f /etc/opt/remi/php71/php.ini /etc/php.ini && \
ln -s /etc/php.ini /etc/opt/remi/php71/php.ini && \
rm -rf /etc/php.d && \
mv /etc/opt/remi/php71/php.d /etc/. && \
ln -s /etc/php.d /etc/opt/remi/php71/php.d
COPY container-files /
RUN chmod +x /config/bootstrap.sh
WORKDIR /data/www
EXPOSE 9001
現在、これは動作していますが.例えば20個(乱数)の拡張機能や有効/無効を切り替えられる機能を追加したい場合、必要ない20個で終了します。
ENV
(Dockerfileは.envファイルをサポートしていないため) 定義は、スクリプトが何をすべきかを知るためにこのフラグを設定することだけが目的です ...
- この方法でいいのでしょうか?
-
を使用する必要があります。
ENV
を使用することができますか?
もし、他の方法でこれを実現する方法があれば教えてください。
どのように解決するのですか?
から Dockerfileのリファレンス :
は
ARG
命令は、ビルド時にユーザーが docker build コマンドで builder に渡す変数を定義するものです。--build-arg <varname>=<value>
フラグを使用します。は
ENV
命令は、環境変数<key>
を値に設定します。<value>
.
で設定した環境変数がENV
は、生成されたイメージからコンテナを実行したときに永続化されます。
だから、もしあなたが
ビルドタイム
のカスタマイズが可能です。
ARG
がベストな選択です。
ランタイムカスタマイズが必要な場合(同じ画像を異なる設定で実行する場合)。
ENV
が適している。
例えば20個(乱数)の拡張機能や、有効/無効の切り替えができる機能を追加したい場合。
組み合わせの数を考えると
ENV
を使用して、実行時にそれらの機能を設定することが、ここでは最適です。
しかし、あなたは を組み合わせたものです。 によるものです。
-
を指定した画像を構築する。
ARG
-
それを使って
ARG
をENV
つまり、Dockerfileを含むと。
ARG var
ENV var=${var}
この場合、イメージを構築する際に、特定の
var
の値は、ビルド時に (
docker build --build-arg var=xxx
)、あるいは特定の実行時値でコンテナを実行する (
docker run -e var=yyy
)
関連
-
[解決済み】Dockerエラー:無効な参照形式:リポジトリ名は小文字でなければならない
-
[解決済み] 「docker build" は正確に1つの引数を必要とします。
-
[解決済み] ドッカーコンテナで接続が拒否される
-
[解決済み] docker-compose down default_network エラー
-
[解決済み] docker-proxy - 443 でバインドしようとすると、ユーザーランドプロキシーを開始する際にエラーが発生します。
-
httpコード中にdocker registry apiのインタラクションを呼び出す コード詳細
-
docker: デーモンからのエラー応答。コンテナ名 "/mysql" は既にコンテナによって使用されています。
-
docker base container in bash: sudo: command not found 問題が解決されました。
-
Centos7 5つのステップでDockerをインストールし、公式Dockerイメージにアクセスできない問題を解決します。
-
docker コマンドで例外 permissions denied が発生しました。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】docker-compose.ymlでdocker execを実行する方法
-
[解決済み】Docker - 0.0.0.0:4000 のバインドに失敗: ポートはすでに割り当てられています。
-
[解決済み】D-Bus接続の取得に失敗しました。操作が許可されていません
-
[解決済み] 「docker build" は正確に1つの引数を必要とします。
-
[解決済み] dockerでCOPYするが、除外する
-
[解決済み] docker ps' と 'docker-compose ps' コマンドで異なる結果が表示される
-
rancher のデプロイメントに最小限の可用性の問題はありません。
-
UbuntuでDockerインストールしたgogsは、サービスを時々再起動するとアクセスできなくなります。
-
[解決済み] Dockerfileを散らかさずに、複数の環境変数を読み込むには?
-
[解決済み】Dockerfileで変数を定義する方法は?