docker compose build
したら環境変数が読み込まれない現象が発生しましたのでメモ
構成
/root |- /app |- docker-compose.yml |- .env
.env
にある環境変数を docker-compose.yml
で読み込んで environment
でコンテナに渡すようにしていました。
.env
は docker compose
コマンドを実行した階層から読み込まれる
/app
ディレクトリで docker-compose build
した際に環境変数が読み込まれていませんでした。
.env
ファイル
- Compose バージョンv1.28以降は、
.env
ファイルはプロジェクトのベースディレクトリに置くようになりました。- プロジェクトディレクトリは
--file
オプションか、あるいは環境変数COMPOSE_FILE
を使って明示的に定義することができます。 これを定めていない場合は、docker compose
コマンドを実行したカレントのワーキングディレクトリとなります (1.28以降)。環境ファイルへのパスは、コマンドライン引数に
--env-file
を指定することでオーバーライドすることができます。
--env-file
オプションの利用
ファイル名を引数に与えれば、どこにある何というファイルであっても指定できます。 たとえば.env.ci
、.env.dev
、.env.prod
などでも可能です。 ファイルパスの指定は--env-file
オプションを使って行います。
このファイルパスは、Docker Compose コマンドを実行したカレントなワーキングディレクトリからの相対パスです。
cf. Compose における環境変数 | Docker ドキュメント
ざっくりまとめると下記のような感じ
なので .env
の無い階層で docker compose up
を実行すると .env
が無いものとして環境変数が読み込まれれない。という事だった。
.env
の無い階層で実行する場合は --env-file
オプションで .env
ファイルを指定する必要ある。
ただ、意図せず階層を移動してしまっている時に docker compose
コマンドを実行してしまうと結果同じことになってしまうので、root ディレクトリで実行しようとか Make コマンド経由で実行しようとか 気をつけましょうになってしまうのでどうしたものか…
[参考]