PHP Slim 環境構築(9) 設定ファイル
Introduction
前回は、ローカルS3(互換)をdockerで立てて、それにアクセスしてみました。
今回は、設定ファイルなどを少し整理してみます。
変更点
ソースツリー
前回からの変更・追加ソースは以下の通りです。
$(PROJECTROOT)
/compose
/web_front
Dockerfile
local.conf (default.confからのrename)
/web_hoge
Dockerfile
php.ini
settings.php
docker-compose-common.yml (docker-compose.ymlからのrename)
docker-compose-local.yml
/src
/hoge
/public
index.php
/web_front/Dockerfile
Nginxの設定ファイルを環境(local, developmentなど)毎に変更できるように修正しました。
docker-composeでenvironment, environmentkeyを指定します。
なお、environmentが環境、environmentkeyが環境内の枝番(developement-1とかlocal-hogebranchとか)です。
FROM nginx:1.17.3
ARG environment
# settings
COPY ${environment}.conf /etc/nginx/conf.d/default.conf
RUN deluser www-data \
&& addgroup --system --gid 1000 www-data \
&& adduser --system --home /var/www --no-create-home --uid 1000 --gid 1000 \
--disabled-password --disabled-login --shell /usr/sbin/nologin www-data
EXPOSE 3128
EXPOSE 8443
/web_front/local.conf
default.confからrenameしただけで中身は変更していません。
/web_hoge/Dockerfile
phpの設定と、DB接続情報などを環境毎に変更できるようにしました。
/web_front/Dockerfileと同様に、docker-composeでenvironmentを指定します。
なお、php-fpmの設定は今回変更していませんが、php.iniと同様の方法で、/usr/local/etc/php-fpm.d/zz-overwrite.confなどに設定をコピーするようにすることで設定を変更することもできます。
FROM php:7.3.9-fpm-alpine3.10
ARG environment
...(略)...
# xdebug(2.7.2) extension=xdebug.so
RUN if [ "${environment}" = "local" ]; then \
pecl install xdebug-2.7.2 \
&& docker-php-ext-enable xdebug \
&& echo "xdebug.remote_enable=1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
&& echo "xdebug.remote_connect_back=0" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
&& echo "xdebug.remote_autostart=0" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
; fi
# settings
COPY settings.php /var/www/settings.php
# PHP conf
COPY php.ini /usr/local/etc/php/conf.d/php.ini
RUN apk del --purge .build-deps \
&& docker-php-source delete \
&& rm -rf /var/cache/apk/* \
&& rm -rf /tmp/*
...(略)...
/web_hoge/php.ini
エラーログを出力するようにしています。出力先はphp-fpmのデフォルト設定である標準エラー出力になります。
したがって、docker-compose logsコマンドでエラーログを見ることができます。
[PHP]
log_errors = On
display_startup_errors = On
error_reporting = E_ALL
upload_max_filesize = 256M
/web_hoge/settings.php
/src/hoge/public/index.phpのDIコンテナの設定部分を抜き出しただけです。
<?php
return [
'userdb' => [
'host' => 'mysql',
'dbname' => 'userdb',
'user' => 'scott',
'password' => 'tiger'
],
'logdb' => [
'host' => 'postgresql',
'dbname' => 'logdb',
'user' => 'root',
'password' => 'hogehoge'
],
'redis' => [
'host' => 'redis'
],
'dynamodb' => [
'endpoint' => 'http://dynamodb:8000',
'region' => 'ap-northeast-1'
],
'storage' => [
'endpoint' => 'http://storage:9000',
'region' => 'ap-northeast-1'
]
];
docker-compose-common.yml, docker-compose-local.yml
前までのdocker-compose.ymlを環境依存の部分と非依存の部分で分けました。
そのため、docker-composeコマンドを実行する場合は、以下のように設定ファイルを指定する必要があります
(-fは指定した順序に読み込まれ、後に指定した設定によって上書きされます)。
$ docker-compose -f docker-compose-common.yml -f docker-compose-local.yml build
docker-compose-common.ymlは旧docker-compose.ymlからサーバ名などの部分を取り除いた部分になります。
version: '3'
services:
web_front:
build:
context: ./web_front
ports:
- "80:3128"
- "443:8443"
volumes:
- ../certs:/etc/certs:ro
container_name: web_front
networks:
- private_net
web_hoge:
build:
context: ./web_hoge
volumes:
- ../src/hoge:/var/www/hoge
- ../src/vendor:/var/www/vendor
container_name: web_hoge
networks:
- private_net
redis:
build:
context: ./redis
volumes:
- redis-data:/var/lib/redis
ports:
- "16379:6379"
sysctls:
- net.core.somaxconn=1024
container_name: redis
networks:
- private_net
mysql:
build:
context: ./mysql
volumes:
- mysql-data:/var/lib/mysql
ports:
- "13306:3306"
container_name: mysql
networks:
- private_net
postgresql:
build:
context: ./postgresql
volumes:
- postgresql-data:/var/lib/postgresql
ports:
- "15432:5432"
container_name: postgresql
networks:
- private_net
dynamodb:
image: amazon/dynamodb-local
container_name: dynamodb
ports:
- "18000:8000"
networks:
- private_net
storage:
image: minio/minio
volumes:
- storage-data:/data
container_name: storage
ports:
- "19000:9000"
environment:
MINIO_ACCESS_KEY: minio
MINIO_SECRET_KEY: miniminio
command: server /data
networks:
- private_net
volumes:
redis-data:
mysql-data:
postgresql-data:
storage-data:
networks:
private_net:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.28.0.0/24
逆に、docker-compose-local.ymlはdocker-compose-common.ymlから取り除かれた部分になります。
version: '3'
services:
web_front:
build:
args:
- environment=local
- environmentkey=
web_hoge:
build:
args:
- environment=local
- environmentkey=
environment:
XDEBUG_CONFIG: "remote_host=172.28.0.1"
PHP_IDE_CONFIG: "serverName=hoge.localhost"
domainname: localhost
index.php
以前のソースで、ContainerBuilder::addDefinitionsを呼び出したとき設定していたsettingsを、外部から呼び出してきてセットするように修正しています。
...(略)...
/** @var Composer\Autoload\ClassLoader $loader */
$loader = require __DIR__ . '/../../vendor/autoload.php';
$loader->addPsr4('Hoge\\', __DIR__ . '/../lib');
$settings = require __DIR__ . '/../../settings.php';
$containerBuilder = new ContainerBuilder();
$containerBuilder->addDefinitions([
'settings' => $settings,
'userdb' => function (ContainerInterface $container) {
ここまでのソース
こちらでどうぞ。