Dockerfile には、コンテナ内で利用する変数を設定するために、ENV
と ARG
というコマンドが用意されています。これらを使うことで、設定値や構成を柔軟に管理できるようになります。しかし、ENV
と ARG
には役割や利用範囲に違いがあるため、それぞれの使い方や違いについて解説します。
ARG とは?
ARG
は、Docker イメージをビルドする際に設定できるビルド時の引数です。主に、ビルドプロセス中に使用する変数として使われ、ビルド時にコマンドラインや他のビルドツールから値を渡すことができます。
特徴:
- ビルド時にのみ利用可能:
ARG
で指定した値は、イメージをビルドする間に使われ、ビルドが完了した後、コンテナの中には引き継がれません。 - デフォルト値の指定が可能: もしコマンドラインで指定されない場合のために、デフォルト値を設定できます。
使用例:
# ビルド時に指定できる引数を定義
ARG VERSION=1.0
# ビルドプロセス中で引数を利用
RUN echo "Building version ${VERSION}"
ARG の利用方法:
docker build
コマンドで引数を渡す場合、--build-arg
オプションを使用します。
docker build --build-arg VERSION=2.0 -t myapp:2.0 .
ENV とは?
ENV
は、コンテナの実行時に使用する環境変数を定義するためのディレクティブです。これにより、ビルド時に設定された値が、コンテナが実行される間も保持され、コンテナ内のプロセスがその値を利用することができます。
特徴:
- 実行時に利用可能:
ENV
で設定された値は、コンテナの実行中ずっと利用可能です。 - 他のステージでも利用可能: 実行中だけでなく、
RUN
コマンド内でも利用できます。
使用例:
# 環境変数を設定
ENV API_ENDPOINT=https://api.example.com
# 環境変数を利用して何かを実行
RUN curl ${API_ENDPOINT}
ENV の利用方法:
docker run
コマンドで環境変数を上書きする場合、-e
オプションを使用します。
docker run -e API_ENDPOINT=https://newapi.example.com myapp
ENV と ARG の違い
項目 | ARG |
ENV |
---|---|---|
目的 | ビルド時の引数 | 実行時の環境変数 |
範囲 | ビルド時のみ利用可能 | コンテナの実行時に利用可能 |
引き継ぎ | コンテナ実行時には引き継がれない | コンテナ実行中も利用可能 |
設定方法 | docker build --build-arg で設定 |
docker run -e で上書き可能 |
まとめ
ARG
は、イメージのビルド時にのみ使う引数として使います。コンテナが実行される時点では、この値はすでに失われています。ENV
は、コンテナの実行中も利用できる環境変数として使います。実行時に値を変更することも可能です。
ARG
を使ってビルド時に必要な設定値を渡し、ENV
で実行時の設定を管理するというのが一般的な使い方です。