普段の業務はほぼLaravel一択なので、CakePHP4の環境構築で色々と調査した。
以下にメモを残しておく。
前提・背景等
- CakePHP4
- php8.1
- mysql8
- ソースコード状態の評価と、アプリケーションに対する新規機能追加の見積もりを行いたい。
- なので、とりあえずローカルで動作する環境を作れればOK
概要
- PHPとMysqlのコンテナがあればとりあえず動くやろの精神
- (後からわかったが)いくつかphp のextensionが必要
- (後からわかったが)メール送信する機能もあったのでMailpitも入れといた
成果物
docker関連
ファイル、ディレクトリの構成は以下の要領
.env
docker-compose-local.yml
docker/local/php/Dockerfile
docker/local/mysql/my.cnf
.env
.env
# docker-compose.yml の名前を変えているため
COMPOSE_FILE=docker-compose-local.yml
# ポートが競合する場合は適宜変更
WEB_PORT=8080
DB_PORT=3306
# mysql、あとでCAKEPHPの設定ファイルに書く
DB_NAME=database_name
DB_USER=database_user
DB_PASS=database_password
# Mailpit関連。こちらもポートが競合する場合は適宜変更する
FORWARD_MAILPIT_PORT=1025
FORWARD_MAILPIT_DASHBOARD_PORT=8025
docker-compose-local.yml
- あくまでlocal用なので、名前ちょっと変えてある
- 参考URLを紛失してしまったのだが、似たようなことをやっている人が居たのでほぼそのままパクって、Mailpitだけ追加
- Mailpitの設定は、Laravel sailで建てるときとほぼ同じ
docker-compose-local.yml
version: '3'
services:
php:
build:
context: ./docker/local/php
dockerfile: Dockerfile
depends_on:
- db
volumes:
- ./:/var/www
ports:
- ${WEB_PORT}:80
db:
image: mysql:8.0
command: --default-authentication-plugin=mysql_native_password
volumes:
- ./docker/local/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
environment:
- MYSQL_DATABASE=${DB_NAME}
- MYSQL_USER=${DB_USER}
- MYSQL_PASSWORD=${DB_PASS}
- MYSQL_ROOT_PASSWORD=${DB_PASS}
ports:
- ${DB_PORT}:3306
restart: always
mailpit:
image: 'axllent/mailpit:latest'
ports:
- '${FORWARD_MAILPIT_PORT:-1025}:1025'
- '${FORWARD_MAILPIT_DASHBOARD_PORT:-8025}:8025'
Dockerfile
やってること、メモなど
- composerのハッシュ値は毎回公式で調べてね
- ドキュメントルートのパスを/var/www/webrootに変更
- Mailpitに送る時必要なのでsendmail
- あと、アプリが使うっぽい拡張をいくつか
- zip
- gd
- extensionについては、DockerでPHP拡張をインストールする方法をググって、適宜足したり引いたりしている(※一部、ちゃんと動いてないものがあるかも?詳細な動作は未確認)
FROM php:8.1-apache
# Composer のバージョン と ハッシュ値
ARG composer_ver=2.5.8
ARG composer_hash=f07934fad44f9048c0dc875a506cca31cc2794d6aebfc1867f3b1fbf48dce2c5
# Composer の保存先
ARG composer_path=/usr/local/bin/composer
# DocumentRoot
ENV APACHE_DOCUMENT_ROOT /var/www/webroot
RUN apt-get update \
&& php -r "copy('https://getcomposer.org/download/$composer_ver/composer.phar', '$composer_path');" \
&& chmod 755 $composer_path \
&& php -r "if (hash_file('sha256', '$composer_path') !== '$composer_hash') { \
echo '!!! Failed to install Composer !!!'; \
unlink('$composer_path'); \
} \
echo PHP_EOL;" \
&& apt-get install -y \
vim \
unzip \
libicu-dev \
libzip-dev \
libonig-dev \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
libjpeg-dev \
sendmail \
sendmail-cf \
mailutils \
&& docker-php-ext-install \
intl \
pdo_mysql \
zip \
gd \
&& 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
my.cnf
- 適宜設定する(特別何もてないので割愛)
アプリケーション側
- Mailpit に送る設定のみ変更。
- 注意点として、portは1025(FORWARD_MAILPIT_PORTで指定したポート番号ではない)
app_local.php
'EmailTransport' => [
'default' => [
'className' => 'Smtp',
'host' => 'mailpit',
'port' => 1025,
'username' => null,
'password' => null,
],
],
苦情・感想
- アプリケーションが特定のPHP拡張に依存してる場合はcomposer.json に記載しておいてほしい(マナー)
- というか、最初からDockerで環境建てて、リポジトリにdocker-compose.yml 入れといてほしい