Docker Composeの環境変数管理|.env・env_file・environment の違い
開発・ステージング・本番で設定値を切り替える——DBパスワード、API キー、接続先URL。Compose にはこれを扱う仕組みが3つあり、紛らわしい。この記事で違いと優先順位をはっきりさせます。
💡 この記事のゴール
①
② 変数展開
③ 優先順位(どれが勝つか)
④ 機密情報の扱い方(環境変数に書くべきでないもの)
①
.env ファイル・env_file・environment の使い分け② 変数展開
${VAR} の挙動③ 優先順位(どれが勝つか)
④ 機密情報の扱い方(環境変数に書くべきでないもの)
目次
- 3つの仕組みの棲み分け
.env(プロジェクト変数)env_file(サービスごとに読み込み)environment(YAML直書き)- 優先順位(どれが勝つか)
- 機密情報の扱い
- 現場で使えるパターン
- まとめ
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"
⚠️
機密情報(DBパスワード・APIキー)が入るので必ず
.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: に両方を列挙することで、環境ごとの差分を整理できます。
.env と env_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} として使われ、そこで初めて environment や env_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つの
第6章のクロージング 6-6 Compose 実践:Webアプリ + DB + リバースプロキシで、ここまで学んだ全要素(services / networks / volumes / depends_on / healthcheck / 環境変数)を1つの
compose.yml に統合します。
参考リンク
- Environment variables in Compose(公式) — 3つの仕組みと優先順位の一次情報源。
- Use secrets in Compose(公式) — 機密情報の安全な扱い方。



コメント