Dockerfileにおける環境変数の設定方法

Dockerfileで環境変数を設定する主要な方法と、それぞれのユースケースについて簡潔に解説する。

1. ENV命令

ENV命令は、Dockerfile内で環境変数を定義する最も基本的な方法である。ここで設定された変数は、後続の命令(RUN, CMDなど)や、コンテナ実行時に参照可能となる。キーと値をスペースで区切る形式と、=で結合する形式があるが、後者は複数の変数を一度に定義でき、可読性が高いため推奨される。

# 形式1: ENV <キー> <値>
ENV APP_VERSION 1.0.0

# 形式2: ENV <キー>=<値> ... (推奨)
ENV DB_HOST="db.example.com" \
    DB_PORT=5432 \
    API_ENDPOINT="/api/v1"

2. ARGとENVの組み合わせ

ARGでビルド時に外部から値を受け取り、それをENVに設定する。これにより、ビルド環境に応じてコンテナの環境変数を動的に変更できる。

# Dockerfile
FROM node:18-alpine

# ビルド引数を定義(デフォルト値: development)
ARG NODE_ENV=development

# ARGの値をENVに設定
ENV NODE_ENV=${NODE_ENV}

# ... 以降のビルドプロセス ...

ビルドコマンドで値を指定する。

# 本番用にビルドする場合
docker build --build-arg NODE_ENV=production -t my-app:prod .

3. 実行時の環境変数設定(推奨)

パスワードやAPIキーなどの機密情報は、Dockerfileに直接記述すべきではない。イメージ履歴に残存し、漏洩リスクとなるためである。これらの情報はコンテナ実行時に外部から注入することがベストプラクティスである。

docker run

-eオプションや--env-fileオプションを使用する。

# -e オプションで個別に指定
docker run -e "DB_PASSWORD=my_secret_password" my-app

# --env-file オプションでファイルから一括読み込み
docker run --env-file ./prod.env my-app

Docker Compose

docker-compose.yml内のenvironmentキーやenv_fileキーで管理する。

# docker-compose.yml
version: '3.8'
services:
  app:
    image: my-app
    environment:
      - DB_USER=admin
      - DB_PASSWORD=${DB_PASS_FROM_HOST} # ホストの環境変数を参照
    env_file:
      - ./common.env

注意点: 機密情報の扱い

警告: ENV命令でパスワードやAPIキーを直接Dockerfileに記述してはならない。docker historyコマンドでイメージレイヤーを調査すれば、値が容易に確認できてしまうため、重大なセキュリティリスクとなる。

まとめ

  • ENV: アプリケーションのデフォルト設定、非機密情報に利用する。Dockerfile内で完結し可読性が高いが、機密情報の記述は厳禁である。
  • ARG + ENV: ビルド環境に応じた設定の切り替えに利用する。ビルドの柔軟性が向上するが、ビルド引数で渡した値もイメージ履歴に残る可能性があるため、機密情報には不向きである。
  • 実行時注入 (docker run, Compose): 機密情報(パスワード、APIキー)、環境ごとの設定に利用する。最も安全で推奨される方法であり、Dockerfileを変更せずに設定を上書きできる。