🏞️
docker composeで.envの変更が反映されなくて困った話
概要
タイトルの通りですが、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