WEB

Dockerを使ってPHPのバージョンアップ動的検証用の環境を立ち上げる

PHPのバージョンアップ動的検証がしたい

前回、DockerとPHPStanを使ってソースコードの静的検証を行いました。

DockerとPHPStanを使ってPHPのバージョンアップ静的検証をするPHPのバージョンアップ静的検証がしたい PHP7のサポートが終了して久しいですが、諸事情により7系を使い続けている人はまだいるのでは...

しかしこれで検出できるのは一部エラーのみで、動作させないと検出できないエラーもたくさんあります。Dockerでphp8の動的検証用環境を作成したいと思います。

1.Dockerで検証環境を構築。

前提環境:ホストマシーン=WSL2+Docker Desktop for Windows

2.PHP公式提供のイメージを利用。

PHP – Official image | DockerHub

今回検証したいのはPHP8+Apache+MySQLの環境です。

3.gdとかimagemagickを使うプログラムがある

4.mysqlも使う

ホストマシーン側ディレクトリ構成

test
 ├config
 │ ├mysql
 │ │ └my.cnf
 │ └php
 │   └php.ini
 ├html
 ├initdb.d
 │ └export_db.sql
 ├mysql
 ├docer-compose.yml
 ├Dockerfile
 └site.conf

Dockerの設定ファイル

Dockerfile

PHPの公式イメージから、8.3.2-apacheを使用することにしました。

DockerfileのRUN等の部分がぐちゃぐちゃですが、前後させたりするとエラーになったりまとめて記述したらエラーになったりで、とりあえずこれで通ったので記載してますが、もっと整理できるはず……?

最初にCOPYしているsite.confファイルには.htaccessが有効になるようにAllowOverride Allが書いてあります。

FROM php:8.3.2-apache

COPY ./site.conf /etc/apache2/sites-available/000-default.conf
RUN apt-get update && apt-get install -y \
    libonig-dev zlib1g-dev libzip-dev zip
RUN docker-php-ext-install pdo_mysql mysqli
RUN docker-php-ext-install zip
RUN apt-get install -y imagemagick libmagickwand-dev; \
mkdir -p /usr/src/php/ext/imagick; \
curl -fsSL https://github.com/Imagick/imagick/archive/refs/tags/3.7.0.tar.gz | tar xvz -C "/usr/src/php/ext/imagick" --strip 1; \
docker-php-ext-configure gd --with-jpeg; \
docker-php-ext-install gd imagick; 
RUN apt-get install -y vim
RUN a2enmod rewrite 

COPY ./config/php/php.ini /usr/local/etc/php/

Dockerfile

docker-compose.yaml

volumeディレクトリの指定とかMySQLの設定をしています。

ホスト側のディレクトリをvolumesで指定することで、MySQLのデータの書き込みをホスト側に記録して、立ち上げなおすたびにデータがリセットされるのを防ぎます。

また、 – ./initdb.d:/docker-entrypoint-initdb.d で、初回起動時にホスト側のinitdb.dの中に置いた初期データ投入用SQLを自動的に実行してくれます。

/initdb.dに置いたexport_db.sqlの中身は、phpMyAdminなどでdb全体をSQL形式でエクスポートしたものです。

version: '3.7'
services:
    web:
        build: .
        container_name: "php83-2"
        volumes:
            - "./html/:/var/www/html"
        privileged: true
        ports:
            - "80:80"
        depends_on:
            - mysql
    mysql:
        image: mysql:8
        volumes:
            - ./mysql:/var/lib/mysql
            - ./config/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
            - ./initdb.d:/docker-entrypoint-initdb.d
        environment:
            - MYSQL_ROOT_PASSWORD=mQk9VkiI3
            - MYSQL_DATABASE=test_db
            - MYSQL_USER=admin
            - MYSQL_PASSWORD=%4VWyjwpk5ii
        ports:
            - "4306:3306"
        container_name: mysql8-1

docker-compose.yaml

<VirtualHost *:80>
    DocumentRoot /var/www/html
    <Directory /var/www/html>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

site.conf

[mysqld]
default_autentication_plugin=mysql_native_password

my.cnf

[Date]
date.timezone = "Asia/Tokyo"
upload_max_filesize = 32M
post_max_size = 32M
memory_limit = 512M
extension=zip

php.ini

ビルドと起動と停止、動作確認

上記ファイルを準備したら、PowerShellなどを起動してtestディレクトリに移動し

...\...\test> docker-compose build
...\...\test> docker-compose up

で、起動します。(buildは初回のみ)

停止は「Ctrl+C」です。

ブラウザでアドレスバーに「localhost」と入力してアクセスすると……

PHPのバージョンアップによりエラーが発生してたぶん動かないことでしょう。

エラーログ出力されるようにしたりでエラー箇所をどしどし修正していきましょう。

以上です

reiko suzuki
OLD SKOOLシステムエンジニア。ねこを撫でながら働いています。