DockerでEC-cube4をPgAdmin付きで構築する。

#前提
Dockerデスクトップをインストール済み
gitコマンドインストール済み

筆者の環境
MacOSX Bigsur
M1チップMacBookPro

このやり方で構築に成功した日。
2021年5月9日。

#EC-cube4のプロジェクトをgitクローンする。

```
git clone https://github.com/EC-CUBE/ec-cube.git
```

#DockerComposeファイルを編集する。
postgresとpgAdminの設定を以下のように書く。



```docker-compose.pgsql.yml
version: '3'

volumes:
  pg-database:
    driver: local

services:
  ec-cube:
    depends_on:
      - postgres
    environment:
      DATABASE_URL: "postgres://dbuser:secret@postgres/eccubedb"
      DATABASE_SERVER_VERSION: 10

  postgres:
    image: postgres:10
    environment:
      POSTGRES_DB: eccubedb
      POSTGRES_USER: dbuser
      POSTGRES_PASSWORD: secret
    ports:
      - 15432:5432
    volumes:
      - pg-database:/var/lib/postgresql/data
    networks:
      - backend

### pgadmin4の設定を追記する。
  pgadmin4:
    image: dpage/pgadmin4
    container_name: pgadmin4
    ports:
      - 8100:80
    volumes:
      - ./pgadmin:/var/lib/pgadmin/storage
    environment:
      PGADMIN_DEFAULT_EMAIL: dotnsf@xxxx.com
      PGADMIN_DEFAULT_PASSWORD: P@ssw0rd
    hostname: pgadmin4
    restart: always
    networks:
      - backend

```

docker-composeは以下のように書く。

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

networks:
  backend:
    driver: bridge

volumes:
  mailcatcher-data:
    driver: local

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

services:
  ### ECCube4 ##################################
  ec-cube:
    build:
      context: .
      args:
        # ビルド時のECCubeインストールスクリプトをスキップする場合にtrueを指定する。
        # ビルド時点でDBサーバの起動や接続が出来ない、という場合等にエラーとなるため。
        SKIP_INSTALL_SCRIPT_ON_DOCKER_BUILD: "true"
    ports:
      - 8090:80
      - 4430:443
    volumes:
      ### 同期対象からコストの重いフォルダを除外 #####################
      - "var:/var/www/html/var"
      - "vendor:/var/www/html/vendor"
      - "node_modules:/var/www/html/node_modules"
    environment:
      # EC-CUBE environments
      APP_ENV: "dev"
      APP_DEBUG: 1
      DATABASE_URL: "postgres://dbuser:secret@postgres/eccubedb"
      DATABASE_SERVER_VERSION: 3
      MAILER_URL: "smtp://mailcatcher:1025"
      ECCUBE_AUTH_MAGIC: "<change.me>"
      ECCUBE_LOCALE: "ja"
      ECCUBE_TIMEZONE: "Asia/Tokyo"
      ECCUBE_CURRENCY: "JPY"
      ECCUBE_ADMIN_ROUTE: "admin"
      ECCUBE_USER_DATA_ROUTE: "user_data"
#      ECCUBE_ADMIN_ALLOW_HOSTS: []
#      ECCUBE_FORCE_SSL: false
#      ECCUBE_TEMPLATE_CODE: "default"
#      ECCUBE_COOKIE_NAME: "eccube"
#      ECCUBE_COOKIE_PATH: "/"
#      ECCUBE_COOKIE_LIFETIME: 0
#      ECCUBE_GC_MAXLIFETIME: 1440
      ECCUBE_ADMIN_USER: "admin"
      ECCUBE_ADMIN_PASS: "password"
    networks:
      - backend

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


```

#ローカル側にPGAdminをマウントするためのフォルダを作成する
ローカル側のEC-cubeをgit cloneしたプロジェクトルートで、
docker-compose.pgsql.ymlに記述したvolumesのコロンの手前の文字列と同じ名前のディレクトリを作成する。

```
mkdir pgadmin
```

#コンテナを立ち上げる。
プロジェクトルートで公式のpgsql用と書いてあるコマンドをコピペして実行する。

```bash
docker compose -f docker-compose.yml -f docker-compose.pgsql.yml -f docker-compose.dev.yml up -d
```

#初回のインストールコマンドを打つ。
公式のコマンドを打つと、DBのマイグレートとシーダーなどの初期化をやってくれる。
これを忘れるとTableがないというエラーになる。

```
docker-compose exec -u www-data ec-cube bin/console eccube:install -n
```

#アクセスする。
ここまででアクセスできると思うので、
ECcube4へは
localhost:8090
pgAdminへは
localhost:8100
をブラウザに打ち込んでアクセスする。
ポート番号は上のymlで設定している番号になるので任意の番号に変更可。
筆者はMAMPで80番を使いたいのでこのように変えています。

#ログイン後のpgAdminのDBコネクション設定
下のページの解説の通りに設定したらできたので続きはそちらをみてください。

https://programming.sincoston.com/docker-db-connect-pg/


#補足・ポイント・困ったことなど
services:の数だけコンテナが別々に立ち上がる。
各サービスのnetworks:の値を揃えることで、コンテナ同士が連携して通信できるようになり、一つのアプリケーションとして機能する。

pgAdminはローカルのどこにマウントしても構わない。ただし、そのフォルダは予め用意しておくこと。
筆者はpostgresのdbのパスと同じかと思い、docker compose upはできるがアクセスすると弾かれるという現象でハマりました。

今回はもうpostgresでやりたいことができたので諦めましたが、本当はmySQLで構築しようとしていました。
しかし、公式のmySQL用コマンドではdocker compose up できず、エラーでこけてしまっていました。
tagを消してlatestにしてもダメだったので、M1チップに対応したイメージがdockerHubにないのかもしれません。
M1マックの人はpostgresを使った方が無難です。(2021/05/09現在)

(2021/05/10追記)
以下の記事の通りにやるとM1チップでもmysqlをインストールできるようになりました。
やぱりCPUが悪いようです。
docker-compose(またはdocker-compose -fで読み込むyml)に以下を追記する。
追記場所はservice:がmysqlのブロック。

```docker-compose.yaml
platform: linux/x86_64
```


https://zenn.dev/tet0h/articles/36dbf4624e2ba6