(最終更新月:2023年9月)
✔以下の疑問をお持ちの方へ向けた記事です
「DockerfileのARGとは具体的に何を指すのだろうか?」
「ARG指示子の使い方や活用方法を理解したい」
「ARGを使ったDockerfileの具体的な記述例が見たい」
✔当記事を読むことで得られる知識
- DockerfileのARG指示子の基本的な概念
- ARGを使った変数の設定やビルド時のパラメータ指定の方法
- 具体的なARGを使用したDockerfileのコード例
当記事では、Dockerfileの中での変数やビルド時のパラメータを設定するためのARG指示子について、その基本的な概念から詳しい使い方、活用方法までをわかりやすく解説します。
ARGをうまく活用することで、柔軟かつ再利用性の高いDockerイメージのビルドが可能です。
ぜひ最後までご覧ください。
✔手を動かして学びたい方へ
Dockerfileの基本について、動画で一から解説しています。
実際にDockerfileを作って、コンテナを起動するまでわずか30分でマスター
ぜひご覧ください。
Dockerfile ARG入門
こちらでは、「Dockerfile ARG」についての入門知識をお伝えしていきます。
- Dockerとは?
- Dockerfile ARGの概要
Dockerとは?
Dockerは、コンテナ技術を用いてアプリケーションとその依存関係をパッケージ化するプラットフォームです。
Dockerのコンテナを活用し、開発環境と本番環境での動作の差異を最小限に抑えられます。
Dockerfile ARGとは
Dockerfile内で使用されるARG命令は、ビルド時に外部から値を渡すためのものです。
ARG version=latest
ビルド時にversion
変数に値を設定できます。
例はこちらです。
# Dockerfile
FROM debian:bullseye-slim
# ARGを使用してversion変数を定義
ARG version
# version変数を使用して何らかの操作を行う(ここではechoコマンドで表示するだけ)
RUN echo "Version is $version"
# その他の命令...
ARGの基本使い方
こちらでは、DockerfileのARGの基本的な使い方についてお伝えします。
- ARGの使用方法
- ARGSのデフォルト値の設定方法
- ARG使用時の注意点
ARGの使用方法
ARGの使い方を見ていきましょう。
Dockerfile内でARG
命令を使用して変数を定義します。
ARG MY_VARIABLE=default_value
ビルド時に--build-arg
オプションを使用して値を指定します。
docker build --build-arg MY_VARIABLE=value .
具体例としては以下のようなものが挙げられます。
docker build --build-arg version=1.22
Dockerfile内のversion
変数に1.22
を設定する例です。
ARGSのデフォルト値の設定方法
ARGにはデフォルト値の設定が可能です。
ARG version=latest
version
変数にデフォルト値としてlatest
が設定されます。
ARG使用時の注意点
ARG
で定義された変数の値は、イメージのビルド時にのみ利用されます。
実行時には利用できませんので、実行時に変数を利用する場合は、ENV
命令を使用してください。
またセキュリティの観点から、機密情報をARG
で直接Dockerfileに記述することは避けるべきです。
Docker ComposeとARG
こちらでは、Docker ComposeでのARGの使い方についてお伝えします。
- Docker Composeとは
- Docker ComposeにおけるARGSの使い方
Docker Compose
Docker Composeは、複数のコンテナを一緒に実行するためのツールです。
docker-compose.yml
という設定ファイルを使用して、サービス、ネットワーク、ボリュームなどの設定を定義します。
Docker Composeを利用する利点は以下のとおりです。
- 複数のコンテナを一度に起動・停止できる。
- 環境の再現性が高まる。
- 複雑なアプリケーションの構成を簡単に管理できる。
Docker ComposeにおけるARGSの使い方
Docker Composeファイル内でもARGを使用できます。
args:
version=1.22
関連するDockerfileのversion
変数に1.22
を設定できます。
version: '3'
services:
myservice:
build:
context: .
dockerfile: Dockerfile
args:
version: 1.22
ARGの可能性
こちらでは、ARGの高度な使用方法と可能性についてお伝えします。
- ENTRYPOINTの切り替え
- Wget時のバージョン指定
- SEDとARGの関連性
- ARGSとEnvsubstの関連性
ENTRYPOINTの切り替え
ARGを使用して、ビルド時にENTRYPOINTを切り替えられます。
以下は開発環境と本番環境で異なるENTRYPOINTを指定する例です。
FROM debian:bullseye-slim
ARG env=production
# 開発環境と本番環境で異なるENTRYPOINTを指定
ENTRYPOINT [ "sh", "-c", "if [ \"$env\" = \"development\" ]; then exec /path/to/dev/command; else exec /path/to/prod/command; fi" ]
ビルド時に環境を指定しましょう。
docker build --build-arg env=development -t myimage .
Wget時のバージョン指定
ARGを使用して、wgetコマンドでダウンロードするファイルのバージョンを指定できます。
FROM debian:bullseye-slim
ARG version=1.22
RUN apt-get update && apt-get install -y wget && \
wget https://example.com/file-${version}.tar.gz
ARG
とRUN
を組み合わせることで、バージョンを動的に指定できます。
SEDとARGの関連性
SEDコマンドとARGを組み合わせることで、ファイル内の特定の文字列をビルド時に置換できます。
例:設定ファイルの特定の値をビルド時に動的に変更する場合など。
FROM debian:bullseye-slim
ARG replace_value=default
COPY config.txt /config.txt
# config.txt内の"PLACEHOLDER"をreplace_valueで置換
RUN sed -i "s/PLACEHOLDER/${replace_value}/g" /config.txt
ビルド時のコマンド例です。
docker build --build-arg replace_value=new_value -t myimage .
ARGSとEnvsubstの関連性
EnvsubstコマンドとARGを組み合わせることで、テンプレートファイルにビルド時に変数を適用できます。
設定ファイルのテンプレートに対して、ビルド時に環境固有の値を適用する場合です。
以下のようなconfig.templateを用意。
server {
listen $PORT;
server_name $SERVER_NAME;
# ...
}
テンプレートを使用するDockerfileです。
FROM debian:bullseye-slim
ARG PORT=80
ARG SERVER_NAME=localhost
COPY config.template /config.template
RUN apt-get update && apt-get install -y gettext-base && \
envsubst < /config.template > /config.conf
ビルド時に変数を指定しましょう。
docker build --build-arg PORT=8080 --build-arg SERVER_NAME=myserver.com -t myimage .
ARGSとENVの比較と使い分け
こちらでは、DockerfileのARGとENVの違いと使い分けについてお伝えします。
- ARGとENVの違い
- ARGとENVの適切な使用法
ARGとENVの違い
ARGとENVは似ていますが、異なる目的で使用されます。
- ARG:ビルド時にのみ使用
- ENV:ビルド時と実行時の両方で使用
ARGとENVの適切な使用法
ARGとENVが異なるのは、以下のような違いからです。
- ARG:ビルド時に外部から値を渡すために使用
- ENV:コンテナ内で環境変数を設定するために使用
パスワードなどの秘密情報はARGで渡し、アプリケーションの設定はENVで設定するなどが良いでしょう。
ARGのスコープと注意点
こちらでは、DockerfileのARGのスコープと注意点についてお伝えします。
- スコープに注意する理由
- ARGスコープに対するベストプラクティス
スコープに注意する理由
Dockerfileの中でARG
を使うとき、どこに書くかが大切です。
FROM
という行の前にARG
を書いた場合、FROM
の後ではそのARG
の値は忘れられてしまいます。
FROM
のあとでもその値を使いたいなら、もう一度ARG
を書きましょう。
例えば、Dockerfileの中で複数の段階(ステージ)を持っていて、それぞれの段階で違うARG
の値を使いたいときは、各段階でARG
を書き直す必要があります。
ARGスコープに対するベストプラクティス
ARGのスコープを理解し、適切に管理することが重要です。
以下が例になります。
- ビルドステージごとに必要なARGを明示的に定義する
- 不要なARGは適切にクリアする
ビルドステージごとに必要なARGを明示的に定義する
Dockerfileの中で複数のビルドステージを持つ場合、各ステージでARGを再定義する必要があります。
# 第1のビルドステージ
FROM debian:bullseye-slim AS build-stage
ARG build_directory=/src
WORKDIR $build_directory
# ... その他のビルド処理 ...
# 第2のビルドステージ
FROM nginx:latest AS deploy-stage
ARG config_directory=/config
COPY --from=build-stage /src/myapp /app
COPY $config_directory/nginx.conf /etc/nginx/
# ... その他の設定 ...
不要なARGは適切にクリアする
セキュリティの観点から、不要になったARGの値はクリアすることが推奨されます。
これにより、生成されたDockerイメージに不要な情報が残らないようにします。
FROM debian:bullseye-slim
ARG secret_key
RUN do_something_with_key.sh $secret_key
# secret_keyをクリア
ARG secret_key=
この例では、secret_key
というARG
を使用して何らかの処理を行った後、その値をクリアしています。
これにより、後続の命令や生成されるイメージにsecret_key
の値が残りません。
実際のDockerfile例
こちらでは、実際のDockerfileでのARGの使用例についてお伝えします。
- NGINX ver1.22利用例
- NGINX ver1.23利用例
NGINX ver1.22利用例
以下は、NGINXバージョン1.22を利用するDockerfileの例です。
FROM nginx:${version}
ARG version=1.22
COPY ./nginx.conf /etc/nginx/nginx.conf
この例では、ARGを使用してNGINXのバージョンを指定しています。
NGINX ver1.23利用例
以下は、NGINXバージョン1.23を利用するDockerfileの例です。
FROM nginx:${version}
ARG version=1.23
COPY ./nginx.conf /etc/nginx/nginx.conf
この例でも、ARGを使用してNGINXのバージョンを指定しています。
Dockerfile ARGに関する一般的な質問とその回答
DockerfileでARGを扱う際の質問をいくつかまとめました。
事前に理解しておけば、避けられるトラブルもあるはずです。
- ARGとENVの違いは何ですか?
- ARGの値はDockerイメージに保存されますか?
- 複数のFROM命令がある場合、ARGはどうなりますか?
ARGとENVの違いは何ですか?
ARGはビルド時にのみ使用され、ENVはビルド時と実行時に使用されます。
ARGの値はDockerイメージに保存されますか?
ARGの値はイメージに保存されず、ビルド時にのみ存在します。
複数のFROM命令がある場合、ARGはどうなりますか?
各FROM命令でARGを再定義する必要があります。
それぞれのビルドステージでARGのスコープが異なります。
まとめ
当記事では、Dockerfile ARGの活用方法についてご説明してきました。
Dockerfile ARGは、ビルドプロセスをカスタマイズし、効率的に管理するための強力なツールです。
Dockerfile ARGの深い理解と実践的な使用のために、公式ドキュメントやコミュニティフォーラムなどのリソースを参照することをお勧めします。
当記事が、Dockerfile ARGの理解と実践的な使用の一助となることを願っています。