BeginnerEngineerBlog
中の人
中の人

【ECCUBE4.2】ECCUBE4.2の開発環境をdockerでphp-fpm環境で構築する

公開: 2022-09-27 23:39
更新: 2023-04-05 23:20
2749
ECCUBE4.2 php php-fpm docker symfony5.x
ECCUBE4.2.0-rcがリリースされて、早速このバージョンを使っての開発が始まるということで、環境構築したのでそのメモです。

こんにちは!

中の人です。

ECCUBE4.2-rcが9月21日?にリリースしました。Release EC-CUBE 4.2.0-rc · EC-CUBE/ec-cube

で、正式版がなんと明日の9月28日にリリース予定らしいです。...明日!?

まぁ、rc版は上記のリンク先のReadme?に書いてあるように正式版のリリースまでコードの変更はしないと言ってますので、多分正式版と99.9999%は一緒でしょう。

ということで、紹介文にも書いてあるように、ECCUBE4.2.x系をdocker環境で、php-fpmで動かす環境を作ったので、忘れないようにメモとして紹介しますよ!

ちなみにですが、ECCUBE4.2-rcには、apacheベースのdockerファイルが同梱されています。
なぜわざわざphp-fpmで環境構築するのかというと、


以前紹介した内容ですが、symfonyのterminateイベントという機能は、php-fpmの環境が前提の機能で、apache環境だとちゃんとした動きにならないのですねーこれ。


ということでphp-fpmで環境構築してみたんですねー前置き長いねーわかってますよーさーせん!

OS: mac-intel

2022-10-21追記
mac-m1でも動いたの確認しました。

編集履歴
2022-12-26
root/docker/docker-nginx/Dockerfileの不要な記述を削除しました(apt-get updateでエラーが発生するようになってたため)
root/docker/docker-php/Dockerfileのxdebugをインストールする記述にバージョン指定を追加しました(xdebugのlatestがphp7.xに対応していないため)

ファイル構成


root
├── .env
├── docker
│   ├── docker-nginx
│   │   ├── Dockerfile
│   │   └── default.conf
│   └── docker-php
│       ├── Dockerfile
│       ├── entrypoint-dev.sh
│       └── php.ini
├── docker-compose.yml
└── ec-cube <- ECCUBE4.2.x
    ├── .env <- インストール後に勝手に作成されるので一旦スルーしてください。後半で紹介します。
    ├── ...


root/docker-compose.yml


version: "3"

networks:
  backend:
    driver: bridge

volumes:
  mysql-database:
    driver: local
  mailcatcher-data:
    driver: local

  ### ignore folder volume #####
  var:
    driver: local
  vendor:
    driver: local

services:
  ### ECCube4 ##################################
  ec-cube:
    build:
      context: .
      dockerfile: ./docker/docker-php/Dockerfile
      args:
        XDEBUG_INSTALL: "${XDEBUG_INSTALL:-false}"
    ports:
      - "9000:9000"
      - "4430:443"
    volumes:
      - "./ec-cube:/var/www/html:cached"
      ### 同期対象からコストの重いフォルダを除外 #####################
      - "./ec-cube/var:/var/www/html/var"
      - "./ec-cube/vendor:/var/www/html/vendor"
    environment:
      - HOST_UID
      - XDEBUG_CLIENT_HOST
      - "XDEBUG_CLIENT_PORT=${XDEBUG_CLIENT_PORT:-9000}"
      - "XDEBUG_INSTALL=${XDEBUG_INSTALL:-false}"
    depends_on:
      - mysql
    networks:
      - backend
  web:
    build: ./docker/docker-nginx
    ports:
      - "${APP_PORT}:80"
    depends_on:
      - ec-cube
      - mysql
    volumes:
      - ./ec-cube:/var/www/html
      - ./docker/docker-nginx/default.conf:/etc/nginx/conf.d/default.conf
    networks:
      - backend
  ### MySQL ##################################
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: eccubedb
      MYSQL_USER: dbuser
      MYSQL_PASSWORD: secret
    volumes:
      - mysql-database:/var/lib/mysql
    ports:
      - 13306:3306
    networks:
      - backend

  ### Mailcatcher ##################################
  mailcatcher:
    image: schickling/mailcatcher
    ports:
      - "1080:1080"
      - "1025:1025"
    networks:
      - backend

  ### phpMyAdmin
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=root
    links:
      - mysql
    ports:
      - 4040:80
    networks:
      - backend


root/.env


APP_PORT=8080
XDEBUG_INSTALL=true
HOST_UID=501
XDEBUG_CLIENT_HOST=host.docker.internal
XDEBUG_CLIENT_PORT=9003


root/docker/docker-nginx/Dockerfile


FROM nginx:1.11



root/docker/docker-nginx/default.conf


server {
    listen 80;
    index index.php index.html;
    server_name php-docker.local;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /var/www/html/;


    location / {
        try_files $uri /index.php$is_args$args;
    }


    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass ec-cube:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        internal;
    }


    location ~ \\.php$ {
        return 404;
    }
}



root/docker/docker-php/Dockerfile


FROM php:7-fpm

ENV APACHE_DOCUMENT_ROOT /var/www/html

RUN apt-get update \
  && apt-get install --no-install-recommends -y \
    apt-transport-https \
    apt-utils \
    build-essential \
    curl \
    debconf-utils \
    gcc \
    git \
    vim \
    zip \
    gnupg2 \
    libfreetype6-dev \
    libicu-dev \
    libjpeg62-turbo-dev \
    libpng-dev \
    libpq-dev \
    libzip-dev \
    locales \
    ssl-cert \
    unzip \
    zlib1g-dev \
    iputils-ping \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/* \
  && echo "en_US.UTF-8 UTF-8" >/etc/locale.gen \
  && locale-gen \
  ;

RUN docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql \
  && docker-php-ext-install -j$(nproc) zip gd mysqli pdo_mysql opcache intl pgsql pdo_pgsql \
  ;

RUN pecl install apcu && echo "extension=apcu.so" > /usr/local/etc/php/conf.d/apc.ini
COPY ./docker/docker-php/php.ini /usr/local/etc/php/conf.d/php.ini

RUN curl -sS https://getcomposer.org/installer \
  | php \
  && mv composer.phar /usr/bin/composer

RUN composer config -g repos.packagist composer https://packagist.jp

ARG XDEBUG_INSTALL
ARG BOOL=true

RUN if [ ${XDEBUG_INSTALL} = ${BOOL} ]; then \
      pecl install xdebug-3.1.5 && docker-php-ext-enable xdebug; \
    fi

COPY ./docker/docker-php/entrypoint-dev.sh /entrypoint-dev.sh
ENTRYPOINT ["/entrypoint-dev.sh"]

CMD ["php-fpm"]



root/docker/docker-php/entrypoint-dev.sh


#!/bin/sh


if [ -n "${HOST_UID}" -a "${HOST_UID}" != "$(id -u www-data)" ]; then
    usermod -u "${HOST_UID}" www-data
fi

if [ -n "${HOST_GID}" -a "${HOST_GID}" != "$(id -g www-data)" ]; then
    groupmod -g "${HOST_GID}" www-data
fi

if [ ${XDEBUG_INSTALL} = true ]; then
ini=$(cat << EOS
xdebug.client_host=${XDEBUG_CLIENT_HOST:-$(ip route | awk 'NR==1 {print $3}')}
xdebug.client_port=${XDEBUG_CLIENT_PORT}
xdebug.start_with_request=yes
xdebug.remote_cookie_expire_time=3600
xdebug.mode=debug
EOS
)
echo "${ini}" >> /usr/local/etc/php/conf.d/php.ini
fi

exec docker-php-entrypoint "$@"


このままだとdocker立ち上げた時に
ERROR: for ec-cube  Cannot start service ec-cube: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "/entrypoint-dev.sh": permission denied: unknown

のようなエラーが発生する(と思う)のでpermissionをいい感じに変更
 $ chmod 755 root/docker/docker-php/entrypoint-dev.sh

root/docker/docker-php/php.ini


opcache.max_accelerated_files = 20000
opcache.memory_consumption=256
realpath_cache_size = 4096K
realpath_cache_ttl = 600
memory_limit = 786M
// 一行改行入れといてください

これは正直なんかのプロジェクトにあったphp.iniをコピペしただけでECCUBE4.2の環境には特に関係ないです。
また、最後に一行以上改行入れとかないと、xdebugを入れる際の処理でいい感じに設定が追加されないので確実に改行は入れといてください。

環境を立ち上げる


そしたらターミナル開いて、rootで

$ docker-compose build
$ docker-compose up

で環境を立ち上げましょう

で、おそらくRelease EC-CUBE 4.2.0-rc · EC-CUBE/ec-cubeこちらからダウンロードした方は

http://localhost:8080/

にアクセスすると、インストーラ画面が開くと思います。
(もしかしたらロード長くてnginxがタイムアウトするかもしれませんが、その時はリロードしてれば開くと思います。)


おー

後半でインストール手順も紹介します。

ここからは、vendorなどがgitignoreされたチームの方向けの手順です。


gitからcloneした方の追加手順


$ docker-compose exec ec-cube bash
$ composer install --no-scripts --no-autoloader --no-plugins -d /var/www/html
$ composer dumpautoload

http://localhost:8080/

これで上記のインストーラ画面が開くはずです。

ちなみに

$ composer install --no-scripts --no-autoloader --no-plugins -d /var/www/html

こちらですが、eccubeをダウンロードすると、デフォルトで使えるプラグインが同梱?されてるっぽいのですが、色々とgitignoreされた環境をcloneした方が

$ composer install

のみのコマンドを実行すると、対象のプラグインが見つからない的なエラーになってcomposer installができません。

よくわからなかったのでプラグイン系はスルーすると上手くcomposer installができました。

この辺はもっと知見の多い方の情報発信を探すことにしましょう!


インストール


そしたら、先ほどのインストーラ画面からの手順を紹介します。


次へ進む


次へ進む


こんな感じで適当に入力して次に進む
(管理画面ログインIDと管理画面パスワードは管理画面ログイン時に必要になるので、メモっとくのがいいと思います。)



こんな感じで入力して次へ進む



次へ進む



インストールが完了したっぽいので管理画面を表示する



サイトの設定画面で入力したidとpasswordを入力してログイン



管理画面にログインできましたね!


mailcatcherの設定


そしたら開発環境でメール送信を確認できるツールの設定をします。

root/ec-cube/.env


# This file is a "template" of which env vars needs to be defined in your configuration or in an .env file
# Set variables here that may be different on each deployment target of the app, e.g. development, staging, production.
# https://symfony.com/doc/current/best_practices/configuration.html#infrastructure-related-configuration

###> symfony/framework-bundle ###
# For production servers, use: "APP_ENV=prod" and "APP_DEBUG=0"
# For local development, use: "APP_ENV=dev" and "APP_DEBUG=1"
APP_ENV=prod
APP_DEBUG=0

~~

###> symfony/mailer ###
MAILER_DSN=smtp://localhost:25
# 👇 以下のように書き換え
MAILER_DSN=smtp://mailcatcher:1025
###< symfony/mailer ###

~~

そしたらメールをキャッチできるか確認してみます。
2023-01-21追記
こちらのファイルはインストールが成功すると自動で作成されています。(前半で説明するって言っておいて説明してませんでした🙇‍♂️)

挙動の確認


そしたら

http://localhost:8080/

にアクセスします。


新規会員登録


適当に会員登録して同意する


会員登録をする


メールが送信されたみたいですので、

http://localhost:1080/

にアクセスします。


大丈夫そうですね!

次にphpmyadminの挙動を確認してみます。


phpmyadminの確認


http://localhost:4040/

にアクセス



dtb_customerテーブルは、先ほど会員登録されたuserの情報が格納されています。

見ての通り大丈夫そうですね!


最後にphpinfoを確認してみます。

phpinfo


php-fpmで環境構築できてるか念の為確認



xdebugが有効になっているか確認



大丈夫でしょう!

終わりに


xdebugの動きなどはご自身で環境に合わせて設定して確認してみてください。
上手くいかなかったらすみません!

ということで、今の所ちゃんと動いてますが、どっかで不具合でたらこの記事の内容をアップデートしていきたいと思います。
また、不要な記述等のご指摘や、これあかんでっていう内容があればご指摘いただけると幸いです。

あと、今回プロジェクトの関係でphp7の最新を使ってますが、ECCUBE4.2はphp8系を推奨しているっぽいです。
php8を使用する際はこの記事を参考に環境構築してみてください。

ECCUBEでの開発頑張って行きましょー!!

お疲れ様でした!
0
0
0
0
通信エラーが発生しました。
似たような記事