EC-CUBE4 500エラー Docker エラー対処

ローカルの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オープンプラットフォーム「EC-CUBE」 EC-CUBEゴールドパートナー EC-CUBEは株式会社イーシーキューブの商標です

EC-CUBEに関するお問い合わせ


    [重要]現在公式にセキュリティサポートが切れていないPHPは8.1以上、MySQLは8.0以上で、対応しているEC-CUBEバージョンは4.2以上です。古いEC-CUBEを使っている方は適切なタイミングでバージョンアップをご検討ください。

    EC-CUBEバージョンアップ