ローカルのDocker開発環境で、昨日まで動いていたEC-CUBE4サイトが突然500エラーになりました。原因はdocker execでrootのままbin/consoleを実行したことで、var/cache配下のファイルがroot所有で再生成され、Webサーバーから書き込めなくなっていたことでした。
エラー内容
デバッグモードで表示されたのは次のエラーです。
Twig\Error\RuntimeError: An exception has been thrown during the rendering of a template
("Your proxy directory "/var/www/html/var/cache/dev/doctrine/orm/Proxies" must be writable").
原因はdocker execのデフォルトユーザーがroot
docker execはデフォルトでrootとして実行されます。一方、コンテナ内のApacheはwww-dataで動いています。
$ docker exec コンテナ名 whoami
root
$ docker exec コンテナ名 ps aux | grep apache2
www-data 18 ... apache2 -DFOREGROUND
rootのままbin/console(スキーマ更新やキャッシュ操作など)を実行すると、そのとき再生成されるvar/cache配下のファイルやディレクトリがroot所有になります。Apacheのwww-dataからは書き込めないため、次にブラウザでアクセスした瞬間に上記の500エラーになる、という流れです。「コマンドは正常に終わったのにサイトが壊れる」ので、原因に気づきにくいのが厄介なところです。
対処
開発環境なので権限を全開放して復旧しました。
docker exec コンテナ名 bash -c "chmod -R 777 /var/www/html/var/cache /var/www/html/var/log"
本番サーバーでは777にせず、所有者をWebサーバーの実行ユーザーに合わせて直してください。
予防は-uで実行ユーザーを合わせる
docker execに-uを付けると実行ユーザーを指定できます。
docker exec -u www-data コンテナ名 php bin/console キャッシュを触るコマンド
-u www-dataで実行すれば、作成されるファイルもwww-data所有になります(www-dataでファイルを作って所有者を確認済み)。Webサーバーの実行ユーザーはイメージによってapacheだったりwww-dataだったりするので、先ほどのps auxで確認してから合わせてください。
EC-CUBEに関するお問い合わせ
[重要]現在公式にセキュリティサポートが切れていないPHPは8.1以上、MySQLは8.0以上で、対応しているEC-CUBEバージョンは4.2以上です。古いEC-CUBEを使っている方は適切なタイミングでバージョンアップをご検討ください。