EC-CUBE4 .env Docker PHP

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つが同時に起きたときです。

  1. bin/console doctrine:query:sqlが失敗する。DBのコンテナがまだ起動していない、接続情報が違う、bin/consoleの起動自体がエラーになる、のいずれでも該当します。
  2. 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オープンプラットフォーム「EC-CUBE」 EC-CUBEゴールドパートナー EC-CUBEは株式会社イーシーキューブの商標です

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


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

    EC-CUBEバージョンアップ