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 コマンド経由で実行しようとか 気をつけましょうになってしまうのでどうしたものか…
[参考]

