かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

Docker compose 起動時に環境変数が読み込まれないにハマる

docker compose build したら環境変数が読み込まれない現象が発生しましたのでメモ

構成
/root
  |- /app
  |- docker-compose.yml
  |- .env

.env にある環境変数docker-compose.yml で読み込んで environment でコンテナに渡すようにしていました。

.envdocker 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 ドキュメント

ざっくりまとめると下記のような感じ

  • docker compose コマンドは実行された階層がプロジェクトのベースディレクトリとして扱われる
  • .env はプロジェクトのベースディレクトリに置くことになっている

なので .env の無い階層で docker compose up を実行すると .env が無いものとして環境変数が読み込まれれない。という事だった。
.env の無い階層で実行する場合は --env-file オプションで .env ファイルを指定する必要ある。

ただ、意図せず階層を移動してしまっている時に docker compose コマンドを実行してしまうと結果同じことになってしまうので、root ディレクトリで実行しようとか Make コマンド経由で実行しようとか 気をつけましょうになってしまうのでどうしたものか…


[参考]