EC-CUBEの公式Dockerイメージ(ghcr.io/ec-cube/ec-cube-php)は、起動時にDBへ接続できず、かつDATABASE_URLをコンテナの環境変数で渡していないと、プロジェクトの.envを.env.distで上書きします。既存のプロジェクトをマウントして使う場合は、DATABASE_URLを必ず環境変数で渡すことで防げます。
.envは通常gitの管理外なので、上書きされるとgitから戻せません。別のPHPバージョンのイメージで試す、DBのコンテナより先に起動する、といった場面で起きやすい挙動です。
上書きが起きる条件
イメージの/usr/local/bin/docker-php-entrypointには、起動のたびに実行される次の処理があります(該当部分を抜粋)。
bin/console doctrine:query:sql 'select * from dtb_base_info' > /dev/null 2>&1 || (
database_url="${DATABASE_URL:-}"
if [ -z "${database_url}" ]; then
cp .env.dist .env
...
上書きされるのは、次の2つが同時に起きたときです。
bin/console doctrine:query:sqlが失敗する。DBのコンテナがまだ起動していない、接続情報が違う、bin/consoleの起動自体がエラーになる、のいずれでも該当します。DATABASE_URLがコンテナの環境変数として設定されていない。.envの中にDATABASE_URLが書いてあっても、ここでは環境変数しか見ていません。
イメージ単体で確かめた結果です。.envに目印の行を書き、DATABASE_URLを渡さずにentrypointを実行すると、目印の行は消え、.envは.env.distと同じ内容(DATABASE_URLはSQLite)に置き換わっていました。この分岐では続けてSQLiteへのテーブル作成と初期データの投入、プロジェクト全体の所有者のwww-dataへの変更も実行されます。
環境変数でDATABASE_URLを渡す
docker composeならenvironmentにDATABASE_URLを書いておくだけで、上のcpには入らなくなります。EC-CUBE本体に同梱のdocker-compose.mysql.ymlを重ねて起動する方法も、この設定が入っているので.envの上書きは起きません。
services:
ec-cube:
environment:
DATABASE_URL: "mysql://dbuser:secret@mysql/eccubedb"
DATABASE_SERVER_VERSION: 5.7
DATABASE_CHARSET: "utf8mb4"
初期化処理ごと飛ばしてApacheだけ起動する
PHPのバージョン違いを試すなど、初期化処理そのものを実行したくないときは、entrypointをapache2-foregroundに差し替えます。
docker run -d --name eccube-php82 -p 8982:80 --entrypoint apache2-foreground -v "$PWD":/var/www/html -v "$PWD/passenv.conf":/etc/apache2/conf-enabled/zz-passenv.conf:ro --env-file test.env ghcr.io/ec-cube/ec-cube-php:8.2-apache
このときに注意が必要なのは、環境変数がPHPに届かなくなることです。entrypointは最後にApacheのPassEnv設定を書き出していて、差し替えるとこれが無くなります。PHP側でAPP_ENVが見えないと、EC-CUBEのindex.phpは.envを読み込むので、コマンドラインとWebで接続先や動作モードが食い違います。passenv.confには、渡したい環境変数を自分で並べておきます。
PassEnv APP_ENV APP_DEBUG DATABASE_URL DATABASE_SERVER_VERSION DATABASE_CHARSET MAILER_DSN ECCUBE_AUTH_MAGIC ECCUBE_TEMPLATE_CODE
この形でPHP 8.1と8.2のコンテナを並べて同じDBにつなぎ、プロジェクトの.envを変更せずに動作を比べられました。
EC-CUBEに関するお問い合わせ
[重要]現在公式にセキュリティサポートが切れていないPHPは8.1以上、MySQLは8.0以上で、対応しているEC-CUBEバージョンは4.2以上です。古いEC-CUBEを使っている方は適切なタイミングでバージョンアップをご検討ください。