自由気ままに書いちゃおう

好きなことをつらつらと・・・

【Docker】Dockerfileで記述するARGとENVの違いについて

DockerfileにおけるARGENVの違いについてです。

概要

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におけるENVARGの違いを記述します。

特性 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

このケースでは以下のような動作が期待されます:

  1. ビルド時

    • ARG TEST=1.2.3はビルド時の変数として定義されています。
    • この変数はdocker buildコマンドを実行する際に--build-arg TEST=<値>オプションを使って値をオーバーライドすることが可能です。
    • もしビルド時に--build-argを使わずにビルドすると、TESTはDockerfile内のARG TEST=1.2.3が使用されます。
    • しかし、ENV TEST=1.2.4によって環境変数TEST1.2.4に設定されます。これはビルドプロセスの後半で発生し、ビルドが完了すると、最終的なイメージ内のTEST環境変数は1.2.4になります。
  2. コンテナ起動時

    • ビルドされたDockerイメージからコンテナを起動する際、環境変数TESTENV命令によって設定された値、つまり1.2.4を持っています。
    • ARGはビルド時にのみ使用され、イメージ内には残りません。したがって、コンテナが実行される時、TEST1.2.4として利用されます。

結論として、ビルド時にはARGENVの両方が影響しますが、ビルドが完了した後のイメージでは、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のみを使用することができます。

以上です。