1. ホーム
  2. docker

[解決済み] ARGとENV、この場合どちらを使うか?

2022-03-14 06:44:02

質問

些細な疑問かもしれませんが 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
  • それを使って ARGENV

つまり、Dockerfileを含むと。

ARG var
ENV var=${var}

この場合、イメージを構築する際に、特定の var の値は、ビルド時に ( docker build --build-arg var=xxx )、あるいは特定の実行時値でコンテナを実行する ( docker run -e var=yyy )