【Docker PHP8】 拡張モジュール追加とphp.iniの適用

はじめに

今回は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

みたいな感じ

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール