DockerfileのARGとは?その書き方やENVとの違いを解説

※本サイトにはプロモーション・広告が含まれています。

(最終更新月:2023年9月)

✔以下の疑問をお持ちの方へ向けた記事です

「DockerfileのARGとは具体的に何を指すのだろうか?」

「ARG指示子の使い方や活用方法を理解したい」

「ARGを使ったDockerfileの具体的な記述例が見たい」

✔当記事を読むことで得られる知識

  • DockerfileのARG指示子の基本的な概念
  • ARGを使った変数の設定やビルド時のパラメータ指定の方法
  • 具体的なARGを使用したDockerfileのコード例

当記事では、Dockerfileの中での変数やビルド時のパラメータを設定するためのARG指示子について、その基本的な概念から詳しい使い方、活用方法までをわかりやすく解説します。

ARGをうまく活用することで、柔軟かつ再利用性の高いDockerイメージのビルドが可能です。

ぜひ最後までご覧ください。

✔手を動かして学びたい方へ

Dockerfileの基本について、動画で一から解説しています。

実際にDockerfileを作って、コンテナを起動するまでわずか30分でマスター

ぜひご覧ください。

DockerfileでDjangoアプリを簡単公開|Dockerチュートリアルvol.3
Dockerのチュートリアル第3段。Dockerfileについての解説動画です。✔Dockerチュートリアル再生リスト✔Dockerfile関連記事

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

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

ARGRUNを組み合わせることで、バージョンを動的に指定できます。

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の理解と実践的な使用の一助となることを願っています。

タイトルとURLをコピーしました