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つ目のデータベースは環境変数で指定できるのですが、それ以上は指定する方法がなさそうだったので初回起動時に作成するためのものです。
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