DockerfileにおけるARG
とENV
の違いについてです。
概要
ARG
ARG
はビルド時の変数です。- Dockerイメージをビルドする際に、
docker build
コマンドの--build-arg
オプションを使って値を渡すことができます。 - 例えば、
docker build --build-arg VERSION=1.2.3 .
のように使用します。 ARG
で定義された変数は、イメージがビルドされた後は使用できません。
ENV
ENV
は環境変数です。- これはイメージ内で永続的に設定され、コンテナが実行されるときに使用されます。
ENV
は、イメージがビルドされた後もコンテナ内で利用可能です。- 例えば、
ENV PATH /usr/local/bin:$PATH
のように使用します。
簡単に言うと、ARG
はイメージのビルド時にのみ使われ、ENV
はビルド後のイメージ内で常に利用可能な環境変数として機能します。
まとめ
以下に、DockerfileにおけるENV
とARG
の違いを記述します。
特性 | ARG | ENV |
---|---|---|
定義場所 | Dockerfile内で定義。 | Dockerfile内で定義。 |
使用タイミング | イメージのビルド時にのみ使用される。 | イメージのビルド時と、ビルド後のコンテナ実行時に使用される。 |
ビルド時の設定 | docker build コマンドの --build-arg オプションを使用して値を設定。 |
Dockerfile内で直接設定。ビルド時のスクリプトなどで使用可能。 |
ビルド後の利用 | ビルドが完了すると利用できなくなる。 | コンテナ内で環境変数として持続し、実行時に利用可能。 |
コンテナ実行時の設定 | コンテナ実行時には直接使用できない。 | docker run コマンドの -e オプションを使用して、コンテナ実行時に値を設定可能。 |
デフォルト値 | デフォルト値を設定することができる(例:ARG VERSION=1.0 )。 |
デフォルト値を設定することができる(例:ENV NODE_ENV=production )。 |
スコープ | ビルド中のみスコープ内に存在し、ビルド完了後は破棄される。 | イメージ内に永続し、コンテナ実行時も利用可能。 |
主な用途 | ビルド時のパラメータや設定のカスタマイズに使用。 | アプリケーションの実行時設定や環境依存の変数設定に使用。 |
オーバーライド | ビルド時にのみオーバーライド可能。 | ビルド時およびコンテナ実行時にオーバーライド可能。 |
具体例1
例えば、Dockerfile内に以下が記述されていたとします。
ARG TEST=1.2.3 ENV TEST=1.2.4
このケースでは以下のような動作が期待されます:
ビルド時:
ARG TEST=1.2.3
はビルド時の変数として定義されています。- この変数は
docker build
コマンドを実行する際に--build-arg TEST=<値>
オプションを使って値をオーバーライドすることが可能です。 - もしビルド時に
--build-arg
を使わずにビルドすると、TEST
はDockerfile内のARG TEST=1.2.3
が使用されます。 - しかし、
ENV TEST=1.2.4
によって環境変数TEST
が1.2.4
に設定されます。これはビルドプロセスの後半で発生し、ビルドが完了すると、最終的なイメージ内のTEST
環境変数は1.2.4
になります。
コンテナ起動時:
- ビルドされたDockerイメージからコンテナを起動する際、環境変数
TEST
はENV
命令によって設定された値、つまり1.2.4
を持っています。 ARG
はビルド時にのみ使用され、イメージ内には残りません。したがって、コンテナが実行される時、TEST
は1.2.4
として利用されます。
- ビルドされたDockerイメージからコンテナを起動する際、環境変数
結論として、ビルド時にはARG
とENV
の両方が影響しますが、ビルドが完了した後のイメージでは、ENV
で設定された値(この場合は1.2.4
)が利用されます。
具体例2
ENVの値はdocker run
実行時に別の値に置換することができます。
上の例だと、
ENV=1.2.4
ではなく、1.2.5
を利用してコンテナ起動させることができます。
docker run
コマンドを実行する際に-e
オプションを使用して、Dockerfile内で設定された環境変数(ENV
)の値をオーバーライドすることができます。
たとえば、上記の例でENV TEST=1.2.4
と設定されている場合、コンテナを起動する際に以下のようにコマンドを指定することでTEST
変数の値を1.2.5
に変更することが可能です:
docker run -e "TEST=1.2.5" <イメージ名>
このコマンドにより、コンテナ内でのTEST
環境変数の値は1.2.5
になります。
これは、コンテナ起動時に-e
オプションで指定された値が、Dockerfileで設定されたデフォルトの環境変数の値を上書きするためです。
さいごに
ENV
で設定された変数は、Dockerfileのビルドプロセス中に利用可能です。これは、その後の命令(例えばRUN
命令内でのスクリプト実行など)で使うことができます。同時に、
ENV
で設定された変数は、イメージが作成された後のコンテナ環境にも引き継がれます。- そのため、コンテナを実行する際に、
docker run
コマンドの-e
オプションを使用して、これらの環境変数の値を変更することができます。
- そのため、コンテナを実行する際に、
ARG
はビルド時のみの変数であり、ビルドが完了すると利用できなくなります。
したがって、ビルドプロセス中に変数を設定し、コンテナ実行時に変更する可能性を許容する場合、ENV
のみを使用することができます。
以上です。