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
)- http://localhost:8000/ にアクセスするとCakePHP のスタートページが表示されます。
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
migrate
と test
を追加しました。
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