Contents
はじめに
今回はPHP-FPMコンテナの作成を取り上げます。
Docker Compose を使用してのPHP8.2+mysql8+nginxのローカル開発環境の構築の記事は後ほどアップ予定です。
状況
本番環境はすでに構築されています。今回の目標はこの本番環境にできるだけ近いローカル開発環境をDockerで構築することです。拡張モジュールをできるだけ同じにする必要があります。
最終的なDockerFile
FROM php:8.2.8-fpm
ENV TZ Asia/Tokyo
RUN apt-get update
RUN apt-get install -y \
git \
unzip \
libenchant-2-2 \
libenchant-2-dev \
libbz2-dev \
libzip-dev \
libicu-dev \
libonig-dev \
libffi-dev \
libpng-dev \
libgmp3-dev \
libc-client-dev \
libkrb5-dev \
libldap2-dev \
libpspell-dev \
libsnmp-dev \
libxml2-dev \
libtidy-dev \
libxslt-dev
RUN docker-php-ext-configure imap --with-kerberos --with-imap-ssl
RUN docker-php-ext-install \
bcmath \
bz2 \
calendar \
dba \
exif \
enchant \
ffi \
gd \
gettext \
gmp \
imap \
intl \
ldap \
mysqli \
mbstring \
pcntl
RUN docker-php-ext-install \
pdo_mysql \
pspell \
shmop \
snmp \
soap \
sockets \
sysvmsg \
sysvsem \
sysvshm \
tidy \
xsl \
opcache \
zip
COPY ./container/app/php.ini $PHP_INI_DIR/conf.d/php.ini
COPY --from=composer /usr/bin/composer /usr/bin/composer
WORKDIR /usr/home/{アプリのパス}
php.iniを反映させる
php.iniを任意の場所に置き、以下のように書きます。
COPY {php.iniを置いた場所} $PHP_INI_DIR/conf.d/php.ini
公式を見よう
https://hub.docker.com/_/php
私はdocker-composeでビルドするので、docker-compose.ymlからの相対パスで書いてます。
拡張モジュールの追加方法
必要なモジュールをRUN docker-php-ext-install {モジュール名}
で追加していきます。PHPの拡張モジュールにはUbuntsu側のライブラリに依存しているものもあるので注意。先にRUN apt-get install -y {ライブラリ名}
で追加しよう。
私のところは本番サーバがFreeBSDなので、Ubuntsuではどのライブラリを追加すればいいのか結構苦戦。。Docker phpのExtensionで必要なライブラリリストを書いてくれてる人がいて助かりました。ぜひ参考に
https://gist.github.com/hoandang/88bfb1e30805df6d1539640fc1719d12
使用可能な拡張モジュール名
docker run --rm -it php:8.2.8-fpm docker-php-ext-install
(php:8.2.8-fpm のところはイメージ名を)
とすると使用可能な拡張モジュール名が出てきます。スペルとか合ってるか確認して下さい。
モジュール追加によるエラー
大体ubuntsu側のモジュールがないか、installの必要がない場合が多いかと思います。
PHPの公式ドキュメントでモジュールを検索し、インストール要件やインストール手順を見てみましょう。コアライブラリにすでにある場合はdockerでもinstallする必要はありません。
ライブラリが必要な場合はapt-getでインストールするように追加しましょう。
docker build時に長文のエラー文が出ますが、大体最後の方を見れば良いと思います。どの行でエラーが出たか言ってくれるので、どこのモジュールインストールで詰まってるか割り出せます。
「ubuntsu {モジュール名}」みたいに調べればapt-get install -y で○○をインストールして。というような情報が出てくるので、それをDockerファイルに追加してやりましょう。
実際のエラー文と解決の方法
エラー文 bz2
configure: error: Please reinstall the BZip2 distribution
解決策 以下を追加
apt-get install -y libbz2-dev
enchantモジュール
apt-get install -y libenchant-2-2 libenchant-2-de
エラー文 gd かな? 他のモジュールでも使ってそう。
configure: error: Package requirements (libpng) were not met:
以下を追加
apt-get install -y libpng-dev
gmp
configure: error: GNU MP Library version 4.2 or greater required.
以下を追加
apt-get install -y libgmp3-dev
imap
configure: error: utf8_mime2text() has new signature, but U8T_CANONICAL is missing. This should not happen. Check config.log for additional information.
以下を追加
apt-get install -y libc-client-dev
その後これも出る
configure: error: This c-client library is built with Kerberos support.
#0 50.25
#0 50.25 Add --with-kerberos to your configure line. Check config.log for details.
設定を加える
RUN docker-php-ext-configure imap --with-kerberos --with-imap-ssl
soap
configure: error: Cannot find ldap.h
libnss-ldap libpam-ldap ldap-utils
以下を追加
apt-get install -y libxml2-dev
みたいな感じ