docker compose で env_file が読み込まれない
`docker compose` は `.env`(プロジェクトディレクトリ)と `env_file:`(サービス内環境変数)を別物として扱う。
値が反映されない時はどちらに書いたかと、Compose 仕様の優先順位を確認する。
#env-file#compose#environment#dotenv#interpolation
公開: 更新:
要約
Compose の env は 2 系統ある。
プロジェクト直下の .env は YAML 内 ${VAR} の補間用、env_file: と environment: は コンテナに渡す用。
混同すると「YAML 上は正しいのにコンテナ内で空」になる。
よくある原因
- 役割の混同:
${IMAGE_TAG}を展開したいのにenv_file:に書いている。 - 上書き:
environment:で書いたDEBUG=falseがenv_file:のDEBUG=trueを勝ち抜く。 - ディレクトリ違い:
compose.ymlのあるディレクトリではなく親でdocker compose upしている。 export付き: Bash 流にexport FOO=barと書くと Compose は警告を出し、KEY=VALUE部分しか拾わない場合がある。- クォート問題:
PASSWORD="a b"のような引用符はそのまま値の一部になる(外す必要がある)。
解決策
1. 用途で書く場所を分ける
# compose.yml
services:
app:
image: myapp:${TAG} # .env の TAG を補間
env_file: .env.app # コンテナ内で読みたい値
environment:
LOG_LEVEL: debug # 個別上書き2. 優先順位を理解する
公式ドキュメント に明記された順:
docker compose run -e引数environment:env_file:- shell 環境変数
- プロジェクト直下の
.env - Dockerfile の
ENV
下位は上位で上書きされる。
3. .env の書式は KEY=VALUE のみ
# OK
DB_HOST=localhost
DB_PORT=5432
# NG(export は付けない)
export DB_USER=admin4. config サブコマンドで展開後を確認
docker compose config${VAR} が解決済みの YAML が表示される。
空欄や ${TAG} のまま残っていれば .env が読まれていない。