dockerでamazonlinux2の環境にApache入れてeccube4.1の開発環境を構築

こんにちは！

久しぶりの投稿になりますkamotetuです！

eccube4.1がリリースされ、早速仕事でeccubeでの開発が始まりました。

最初はeccubeをダウンロードしたときについてくるdockerfileでささっとApacheベースの環境を構築したのですが、リリース予定のサーバーがawsということで、上司からamazonlinuxにapacheをインストールする形で環境構築してと言われ、おぅぅ。。となってなんとか構築できたので、メモとして投稿します！

同じような環境で開発環境を整えたい方は参考にしてください！

前提としてeccube4.1がダウンロード済みとします！
[eccube](https://www.ec-cube.net/)

あと、osはmacを使用しています。

###ディレクトリ構成
```
.
├── docker
│   ├── apache
│   │   ├── .htaccess
│   │   └── 000-default.conf
│   └── php
│       ├── Dockerfile
│       ├── entrypoint-dev.sh
│       └── php.ini
├── docker-compose.yml
├── .env
└── ec-cube
    ├──.env <-webインストーラでインストール後に勝手に作成されます。
    ...

```

###ファイルの中身

docker/apache/.htaccess

```docker/apache/.htaccess
order allow,deny
deny from all
```

docker/apache/000-default.conf

```docker/apache/000-default.conf
<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride All
    Allow from All
    Require all granted
</Directory>
```

docker/php/Dockerfile

```docker/php/Dockerfile
FROM amazonlinux:2

RUN yum update -y \
    && yum upgrade -y \
    && yum install -y  \
      apt-transport-https \
      apt-utils \
      build-essential \
      debconf-utils \
      gnupg2 \
      libfreetype6-dev \
      libicu-dev \
      libjpeg62-turbo-dev \
      libpng-dev \
      libpq-dev \
      libzip-dev \
      locales \
      ssl-cert \
      zlib1g-dev \
      curl \
      git \
      libxml2 \
      libxml2-devel \
      httpd \
      mysql \
      gcc \
      gcc-c++ \
      vim \
      make \
      wget \
      systemd \
      unzip \
      sudo \
      php-pear \
      php-devel \
      libzstd \
      mod_ssl

RUN yum -y install yum-utils

RUN yum install -y php-pdo php-mysql zip gd opcache intl

RUN wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

RUN rpm -ivh epel-release-latest-7.noarch.rpm

RUN yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

RUN yum-config-manager --enable remi-php74

RUN yum install -y php74 php74-php

RUN yum install -y php74-php-intl.x86_64 \
    php74-php-mysqlnd.x86_64 \
    php74-php-xml.x86_64 \
    php74-php-mbstring.x86_64 \
    php74-php-pecl-krb5-devel.x86_64

RUN yum update -y --disablerepo=amzn2-core

RUN yum install -y php74-php-pecl-zip.x86_64

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

RUN yum clean all

RUN sed -ie '354,356d' /etc/httpd/conf/httpd.conf

RUN mv /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.confdisable

RUN ln -f -n -s /usr/bin/php74 /usr/bin/php

COPY ./docker/php/php.ini /etc/opt/remi/php74/php.d/php.ini
COPY ./docker/apache/.htaccess /
COPY ./docker/apache/000-default.conf /etc/httpd/conf.d/000-default.conf

ARG XDEBUG_INSTALL
ARG BOOL=true

RUN if [ ${XDEBUG_INSTALL} = ${BOOL} ]; then \
      yum install -y php-pecl-xdebug3.x86_64; \
    fi

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

CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
```

docker/php/entrypoint-dev.sh

```docker/php/entrypoint-dev.sh
#!/bin/sh

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

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

ini=$(cat << EOS
xdebug.client_host=${XDEBUG_CLIENT_HOST:-$(ip route | awk 'NR==1 {print $3}')}
xdebug.client_port=${XDEBUG_CLIENT_PORT}
zend_extension="/usr/lib64/php/modules/xdebug.so"
xdebug.start_with_request=yes
xdebug.remote_cookie_expire_time=3600
xdebug.mode=debug
EOS
)
echo "${ini}" >> /etc/opt/remi/php74/php.d/php.ini
fi

exec "$@"
```

docker/php/php.ini

```docker/php/php.ini
opcache.max_accelerated_files = 20000
opcache.memory_consumption=256
realpath_cache_size = 4096K
realpath_cache_ttl = 600
memory_limit = 786M
(一行改行を入れといてください。)
```

docker-compose.yml

```docker-compose.yml
version: "3"

networks:
  backend:
    driver: bridge

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

services:
  ### ECCube4 ##################################
  ec-cube:
    build:
      context: .
      dockerfile: ./docker/php/Dockerfile
      args:
        XDEBUG_INSTALL: "${XDEBUG_INSTALL:-false}"
    ports:
      - 8080:80
      - 4430:443
    volumes:
      //ec-cubeのデフォルトではvendorとvarもここに書いてありましたが、自分の使っているIDEの入力補完ができなかったため削除しました。
      - "./ec-cube:/var/www/html:cached"
    environment:
      - HOST_UID
      - XDEBUG_CLIENT_HOST
      - "XDEBUG_CLIENT_PORT=${XDEBUG_CLIENT_PORT:-9000}"
      - "XDEBUG_INSTALL=${XDEBUG_INSTALL:-false}"
    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:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=root
    links:
      - mysql
    ports:
      - "4040:80"
    networks:
      - backend
```

(プロジェクトディレクトリの).env

```.env
XDEBUG_INSTALL=false <- xdebugインストールする場合true
HOST_UID=501 <-　macの？場合
XDEBUG_CLIENT_HOST=host.docker.internal <- macの場合
XDEBUG_CLIENT_PORT=9000
```

そしたらターミナル起動してプロジェクトディレクトリで

```
$ docker-compose up --build
```

多分立ち上がるはず
(ec-cubeをダウンロードした際、vendorディレクトリも一緒にダウンロードされているので、ダウンロードした本人はこの時点でwebインストーラーが起動するはず。以下、.gitignoreでvendorを指定した別のメンバー向けのための手順)

そしたら、

```
$ docker-compose exec ec-cube bash
```

でコンテナの中に入って、

```
$ cd /var/www/html
```

に行って、

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

(めちゃ時間かかります)
で、

```
$ composer dumpautoload
```

そしたら、ブラウザに

```
http://localhost:8080
```

でwebインストーラ?が起動するはずです！

###webインストーラが立ち上がったら

- step1: 次へ進む
- step2: 次へ進む
- step3:
    - あなたの店名: (適当)
    - メールアドレス: (適当)
    - 管理画面ログインID: (適当)
    - 管理画面パスワード: (適当)
    - 管理画面のディレクトリ名: (admin以外)
    - 次へ進む
- step4:
    - データベースの種類: MySQL
    - データベースのホスト名: mysql
    - データベースのポート番号: (未入力 or 3306)
    - データベース名: eccubedb
    - ユーザ名: dbuser
    - パスワード: secret
    - 次へ進む
- step5: 次へ進む

###mailcatcherの設定

ec-cube/.env

```
//省略
MAILER_URL=smtp://mailcatcher:1025
//省略
```


正直不必要な処理も入ってるかもしれませんが、ひとまず動きました。

参考: [AmazonLinux2にphp7.2+Apacheの環境を作る & Docker](https://qiita.com/thimi0412/items/9df65e626e8df2029df5)