🏞️

docker composeで.envの変更が反映されなくて困った話

2025/02/03に公開

概要

タイトルの通りですが、docker composeでイメージビルドをする際に.envを変更しても環境変数の変更が反映されずに困ったという話です。
Dockerfile内でgit cloneを行う際のリポジトリパスワードを.envで管理していたのですが、docker compose build --no-cacheで再ビルドを行ったところパスワード期限切れでエラーが出たため、.envを変更してもう一度実行したところ変更が反映されていませんでした。
色々調べてイメージやキャッシュの削除をしたり、dockerの再起動をしたりしても反映されずに困りました。

対処

コンソールを再起動して実行するだけで解決しました……。
--build-argのオプションを付けて明示的に環境変数を上書きする方法もあるようですが、コマンドが長くなってしまいあまり嬉しくないです。

原因

docker compose build --no-cacheで実行すれば.envファイルから毎回環境変数を読み込んで使うのだと思っていましたが、実際にはシェルに環境変数を設定してそれを読んでいると思われ、一度設定した環境変数を上書きしなかったようです。(という表現で完全に正しいか自信はないですが)

Tips

以下のコマンドで変数が展開された状態のdocker composeの設定を確認することができます。

docker compose config

例えば、以下のような設定の場合、

docker-compose.yml
services:
  app:
    build:
      context: .
      args:
        REPOSUSER: ${REPOSUSER}
        REPOSPASSWORD: ${REPOSPASSWORD}
.env
REPOSUSER=<username>
REPOSPASSWORD=<password>

以下のように出力されます。

services:
  app:
    build:
      context: <working directory>
      args:
        REPOSUSER: <username>
        REPOSPASSWORD: <password>
    dockerfile: Dockerfile
    ...

.envを編集後、同じコンソールで再度configを確認(及び変数をecho)しても.envの変更内容が反映されないはずです。

ヘッドウォータース

Discussion