結論
laravel:
env_file:
- ./.env
docker-compose.ymlで上記のようなenv_fileでの.env参照(Composeの環境変数)をやめるでした。
https://docs.docker.jp/compose/environment-variables.html
経緯
Laravelを5年くらい使ってますが、なぜか毎回コンテナを作り直さないと.envが反映されないという
聞いたことがあるような、無いような超不便環境に悩まされてました。
当然、下記は試していました。1
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear
composer dump-autoload
php artisan clear-compiled
php artisan optimize
php artisan config:cache
php artisan key:generate
rm -f bootstrap/cache/config.php
参考
https://qiita.com/Ping/items/10ada8d069e13d729701
https://qiita.com/ponsuke0531/items/1a665c68d12a74a29a42
暫定対策
唯一envを反映させることができるコマンド
docker compose down laravel nginx
docker compose up -d laravel nginx
→ビルドではなく、コンテナの再構築だけなので、30秒くらいで反映できるが、頻繁にテストしたい時などその時間すら惜しい状況。。。
気づいたきっかけ
一部bladeファイルを使っている箇所があるのですが、そこはなぜかリアルタイムに反映されていました。
そこから全てではない→そこに糸口がありそうと思い、色々調べたところ、
- bladeは都度php-fpmが再起動して、envを読み直している
- Composeの環境変数として渡すと、Laravelのアプリケーションは初回ブート時に.envを使って初期化を完了させてしまう
ということがわかりました。
注意点
laravel:
env_file:
- ./.env
の便利どころはdocker compose up -d
した時などでLaravelの外で.envを参照したい時です。
そういった使い方をしていると、問題が出てきてしまうので、それ用の環境変数はそれぞれ作成する形に変えるか、上記のまま利用するしかないです。
-
自分が調べた限りだと、LaravelのDocker環境で.envがリアルタイムに反映しない対策としてComposeの環境変数に言及した記事はなかったです。 ↩