6.5 Docker Composeの環境変数管理|.envファイル・env_file・environmentの違い

Docker Compose

Docker Composeの環境変数管理|.envenv_fileenvironment の違い

開発・ステージング・本番で設定値を切り替える——DBパスワード、API キー、接続先URL。Compose にはこれを扱う仕組みが3つあり、紛らわしい。この記事で違いと優先順位をはっきりさせます。

💡 この記事のゴール
.env ファイル・env_fileenvironment の使い分け
② 変数展開 ${VAR} の挙動
③ 優先順位(どれが勝つか)
④ 機密情報の扱い方(環境変数に書くべきでないもの)

目次

  1. 3つの仕組みの棲み分け
  2. .env(プロジェクト変数)
  3. env_file(サービスごとに読み込み)
  4. environment(YAML直書き)
  5. 優先順位(どれが勝つか)
  6. 機密情報の扱い
  7. 現場で使えるパターン
  8. まとめ

1. 3つの仕組みの棲み分け

仕組み 誰に渡される? 主な用途
.env ファイル Compose 自身(YAMLの ${VAR} 展開用) プロジェクト全体の設定値
env_file: コンテナ内プロセス サービス固有の環境変数セット
environment: コンテナ内プロセス YAMLに直接書く少量の変数
💡 最大の違い:.env は Compose 用、他2つはコンテナ用
.env の中身はデフォルトではコンテナに渡りません。YAMLの ${DB_PASSWORD} を置換するためのテンプレート変数として使われるだけ。コンテナに渡したいなら environment:env_file: を使います。

2. .env(プロジェクト変数)

compose.yml と同じディレクトリに置いた .env ファイルは Compose が自動で読み込み、YAML 内の ${VAR} を置換します。

2-1. 書式

# .env
DB_PASSWORD=s3cret
DB_PORT=5432
IMAGE_TAG=v1.2.3
COMPOSE_PROJECT_NAME=myapp   # 特殊変数:プロジェクト名自体を指定
# compose.yml
services:
  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}    # .env から展開
    ports:
      - "${DB_PORT}:5432"
  app:
    image: myapp:${IMAGE_TAG}              # タグを切り替え可能に

2-2. 展開を確認

$ docker compose config
services:
  app:
    image: myapp:v1.2.3
  db:
    environment:
      POSTGRES_PASSWORD: s3cret
    image: postgres:16
    ports:
      - published: "5432"
⚠️ .env はGit管理しない
機密情報(DBパスワード・APIキー)が入るので必ず .gitignore に入れる。代わりにひな形 .env.example を Git に入れる習慣が一般的。チーム参加時は cp .env.example .env して編集、という流れ。

3. env_file(サービスごとに読み込み)

env_file: は、指定したファイルの中身をコンテナ内プロセスの環境変数として渡します

# app.env
REDIS_URL=redis://cache:6379
LOG_LEVEL=info
FEATURE_FLAGS=new_ui,beta_api
# compose.yml
services:
  app:
    image: myapp
    env_file:
      - app.env           # 複数可
      - secrets.env
💡 ファイル分割で環境を切り替える
common.env(共通)
dev.env / prod.env(環境別)
と分け、env_file: に両方を列挙することで、環境ごとの差分を整理できます。

.envenv_file の違いをもう一度

  .env env_file
自動読み込み ✅ Compose が勝手に読む ❌ YAMLで明示指定
渡される先 Compose 自身${VAR} 展開) コンテナ内プロセス
ファイル名 .env 固定 任意
複数指定 通常1つ YAMLで何個でも

4. environment(YAML直書き)

# 2通りの書き方(どちらでも同じ)

# マッピング形式
services:
  app:
    environment:
      LOG_LEVEL: info
      DEBUG: "false"
      DATABASE_URL: postgres://postgres:${DB_PASSWORD}@db:5432/postgres

# 配列形式
services:
  app:
    environment:
      - LOG_LEVEL=info
      - DEBUG=false
      - DATABASE_URL=postgres://postgres:${DB_PASSWORD}@db:5432/postgres
💡 値がないときホストの環境変数をそのまま透過
- DATABASE_URL(値なし)と書くと、compose コマンドを叩いたシェルの $DATABASE_URL がそのまま渡ります。CIなどで secrets 由来の値をそのまま透過したい時に便利。

5. 優先順位(どれが勝つか)

同じ変数名が複数箇所で定義されたとき、強い順は以下。

【環境変数の優先順位(強い順)】
① compose run/exec の –env で指定

② compose.yml の environment:

③ compose.yml の env_file: (複数あると後ろが上書き)

④ イメージ(Dockerfile)の ENV

↑ 同じ変数名があった場合、上のほうが勝つ
⚠️ .env の値は「YAML展開用」なのでここに入らない
.env は優先順位表に直接は登場しません。YAML 内で ${VAR} として使われ、そこで初めて environmentenv_file 経由でコンテナに届きます。「.env に書いたのにコンテナに入ってない」というつまずきはこの誤解が原因。

6. 機密情報の扱い

DB パスワード等を environment: に書くと、次のリスクがあります:

  • docker inspect で誰でも丸見え
  • プロセスリストの中に出る可能性(言語・設定次第)
  • コンテナログに誤って吐いてしまう事故が起きやすい
情報の種類 推奨置き場所
非機密(URL・ログレベル等) environment / env_file / .env 好きなところ
機密(DBパスワード・APIキー) 開発:.env(Gitignore)/本番:secrets(第8章で詳しく)
本番の機密 Docker Secrets / Vault / AWS Secrets Manager / GCP Secret Manager
# 本番推奨:secrets を使う(6-2 の compose configs/secrets の応用)
services:
  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD_FILE: /run/secrets/db_password
    secrets:
      - db_password

secrets:
  db_password:
    file: ./secrets/db_password.txt

公式イメージは _FILE 付き環境変数をサポートしているものが多く(POSTGRES_PASSWORD_FILE, MYSQL_ROOT_PASSWORD_FILE, 等)、ファイル経由で安全に値を渡せます。


7. 現場で使えるパターン

パターンA:.env + environment(ミニマル)

# .env
DB_PASSWORD=s3cret

# compose.yml
services:
  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}

パターンB:環境別の env_file

# dev.env
LOG_LEVEL=debug
DATABASE_URL=postgres://postgres:dev@db:5432/devdb

# prod.env
LOG_LEVEL=warn
DATABASE_URL=postgres://app@prod-db:5432/appdb

# compose.yml(開発)
services:
  app:
    env_file:
      - dev.env

# 本番だけ別ファイル
docker compose --env-file prod.env up -d

パターンC:ホストの環境変数を透過(CI)

# GitHub Actions の secrets から渡す
services:
  app:
    environment:
      - DATABASE_URL        # ホストの DATABASE_URL を透過
      - API_KEY             # 同上

8. まとめ

仕組み 役割 ファイル
.env Composeがテンプレ変数展開に使う .env(自動読み込み)
env_file: コンテナに環境変数一括投入 任意
environment: コンテナにYAML直書きで渡す (YAML 内)
✅ 次のステップ
第6章のクロージング 6-6 Compose 実践:Webアプリ + DB + リバースプロキシで、ここまで学んだ全要素(services / networks / volumes / depends_on / healthcheck / 環境変数)を1つの compose.yml に統合します。

参考リンク


Dockerの基礎を動画で体系的に学びませんか?

実務で使う基礎だけを3時間に凝縮。環境構築から丁寧に解説しています。

Udemy Docker入門講座 クーポン割引で講座を見る →

コメント

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