こもろぐ @tenkoma

What We Find Changes Who We Become -- Peter Morville著『アンビエント・ファインダビリティ 』

CakePHP3 アプリケーションのためのDocker開発環境を作ってみた

CakePHP Advent Calendar 2018 - Qiita 24日目の記事になります。

先日、第133回 PHP勉強会@東京で「PhpStormとPHPUnitを連携してユニットテスト作成を楽にする」というテーマで発表しました という記事を書きました。 そのとき、利用したサンプルアプリケーションとして tenkoma/cakephp_cms を使ったのですが、デモを簡単にするためにDocker環境を作ったので紹介します。

サンプルアプリケーション tenkoma/cakephp_cmsは去年のCakePHP Advent Calendar 2017 - Qiitaに投稿したCakePHP 3 のチュートリアルにユニットテストを追加する (1), (2)で使ったものです。

Docker設定の概要

Docker環境の設定はshin1x1さんのPhpStorm + Docker for Mac(docker-compose)での PHPUnit と Remote Debug の設定 - Shin x Blogをベースとして以下の変更を加えてあります。

  • CakePHP3アプリケーションに必要な intl拡張をインストール
  • MySQLコンテナを追加
  • 設定ファイルを手動で編集しなくても、環境が作れるように環境変数を docker-compose.yml に記述
  • その他細かい調整

使い方

git clone https://github.com/tenkoma/cakephp_cms.git
cd cakephp_cms

でリポジトリを取得して使います。以下のコマンドが使えます。

  • make 起動してcomposerパッケージインストール(make up + make install)
  • make up 起動
  • make install composerパッケージインストール
  • make migrate データベースマイグレーション
  • make test テスト実行
  • make clean 終了

MySQLデータベースのデータは dbdata/ 以下に保存されるので、リセットしたい場合は、make clean して dbdata/ を削除してください。

設定ファイル

以下、設定ファイル一式です。

docker-compose.yml

docker-compose up -d, docker-compose down に必要な大本の設定です。

version: "3.7"
services:
  web:
    build: ./docker/web
    environment: &app-environment
      DATABASE_URL: "mysql://my_app:secret@dev-db/my_app?encoding=utf8mb4&timezone=UTC&cacheMetadata=true"
      DATABASE_TEST_URL: "mysql://my_app:secret@dev-db/test_myapp?encoding=utf8mb4&timezone=UTC&cacheMetadata=true"
      PHP_IDE_CONFIG: "serverName=localhost"
    volumes:
      - ./:/var/www/html:cached
      - ./docker/web/php.ini:/usr/local/etc/php/php.ini:cached
    working_dir: /var/www/html
    ports:
      - "8000:80"
  php-cli:
    build: ./docker/web
    environment:
      <<: *app-environment
    volumes:
      - ./:/var/www/html
      - ./docker/web/php.ini:/usr/local/etc/php/php.ini
    working_dir: /var/www/html
  dev-db:
    image: mysql:5.7
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
    hostname: dev-db
    container_name: dev-db
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: my_app
      MYSQL_USER: my_app
      MYSQL_PASSWORD: secret
    volumes:
      - ./docker/mysql:/docker-entrypoint-initdb.d:cached
      - ./dbdata:/var/lib/mysql:cached
    ports:
      - "3306:3306"
  composer:
    build: ./docker/composer
    volumes:
      - ./:/app:cached
      - ./docker/web/php.ini:/usr/local/etc/php/php.ini:cached
    working_dir: /app

docker/composer/Dockerfile

Composer パッケージのインストールが早くなるよう、composerコンテナにhirak/prestissimo: composer parallel install pluginを追加しました。

FROM composer

RUN composer global require hirak/prestissimo

docker/mysql/001_initialize_database.sh

MySQL の公式コンテナは1つ目のデータベースは環境変数で指定できるのですが、それ以上は指定する方法がなさそうだったので初回起動時に作成するためのものです。

#!/bin/sh

echo "CREATE DATABASE IF NOT EXISTS \`test_myapp\` ;" | "${mysql[@]}"
echo "GRANT ALL ON \`test_myapp\`.* TO '${MYSQL_USER}'@'%' ;" | "${mysql[@]}"
echo 'FLUSH PRIVILEGES ;' | "${mysql[@]}"

docker/web/Dockerfile

webとphp-cliコンテナのためのDockerfileです。CakePHPアプリ向けにintl拡張、pdo_mysql拡張を追加して、ドキュメントルートを変更しました。

FROM php:7.2-apache

RUN apt-get update && apt-get install -y --no-install-recommends \
        nano \
        libicu-dev \
    && rm -rf /var/lib/apt/lists/*

RUN docker-php-ext-install intl \
    && docker-php-ext-install pdo_mysql \
    && pecl install xdebug \
    && docker-php-ext-enable xdebug

ENV APACHE_DOCUMENT_ROOT /var/www/html/webroot

RUN a2enmod rewrite

RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf

docker/web/php.ini

デバッグの切り替えをBookmarkletで制御したかったのでautostart をOffにして、idekeyを有効にしてあります。

; timezone
date.timezone = Asia/Tokyo

; error reporing
log_errors = On
error_log = /dev/stderr

; xdebug
xdebug.remote_enable = On
xdebug.remote_autostart = Off
xdebug.remote_connect_back = Off
xdebug.remote_host = docker.for.mac.localhost
;xdebug.remote_port=9000
xdebug.idekey=phpstorm

Makefile

migratetest を追加しました。

all: install up
.PHONY: all

up:
  docker-compose up -d
.PHONY: up

install:
  docker-compose run composer install --ignore-platform-reqs --no-interaction
.PHONY: install

migrate:
  docker-compose run php-cli bin/cake migrations migrate
.PHONY: migrate

test:
  docker-compose run php-cli ./vendor/bin/phpunit
.PHONY: test

clean:
  docker-compose down
.PHONY: clean