DockerでPHP7.4の環境構築をした話
結論
PHPのDockerfileに以下を加える。
- DockerでPHP7.4系以上を使うなら、ライブラリの「oniguruma」を入れる。
-
apk add --update --no-cache oniguruma-dev \
を追記。
-
- DockerでMySQLを使うなら、PDOドライバーを入れよう。
-
RUN docker-php-ext-install -j$(nproc) pdo_mysql
を追記。
-
対象
- DockerでPHP7.4以上を使いたい方
- DockerでMySQLの環境構築。
環境
- OS Catalina 10.15.4
- Docker 2.3.0.3
- php:7.4.7-fpm-alpine
はじめに
phpenvを用いてPHPのバージョン管理すればDockerなんて使わなくていいやと思ってたんですけど、MySQLを使うことになって、5.7と8.0系で認証方式が違うとか、8.0系の方が早いとかありますけど、手元のpcにbrewで8.0から5.7系にダウングレードしたらお手上げ状態になったので、勉強も兼ねてサクッとDockerを使いました。
なお、Dockerfileのことしか主にコードを開示していないので、その他は頑張ってください。
問題点
- php:7.4.0*の環境のDockerfileをビルド時
No package 'oniguruma' found
とエラー。 - PHPでMySQLを使おうとすると
could not find driver
というエラー
上記にもあげている通り、2点問題に遭遇しました。
php:7.4.*の環境のDockerfileをビルド時No package 'oniguruma' found
とエラーがでよる。
はい、1つ目です。
RUN apk upgrade --update \
&& apk add --update --no-cache oniguruma-dev \ # ここ
&& apk --no-cache --virtual .build-deps add make g++ gcc re2c autoconf \
&& apk --no-cache add gettext-dev libzip-dev curl-dev \
&& docker-php-ext-install -j$(nproc) gettext mbstring zip opcache ctype json bcmath sockets curl \
&& pecl channel-update pecl.php.net
php:7.4以降はlibonig-dev
というパッケージをする必要があるそうです。
https://github.com/kkos/oniguruma
上記2行目にも書いていますが、apk add --update --no-cache oniguruma-dev
を追加して下さい。
PHPでMySQLを使おうとするとcould not find driver
というエラー
はい、2つ目です。
このエラーが出ている人はphpinfo();
をphpファイルに書いてもらって、
PDO項目を見ていただくとわかると思うのですが、sqlite
しかないと思われます。
つまりデフォルトでドライバーはsqliteしか入ってないらしいですね。
これには少しびっくりしたと同時に、コンテナは本当に最小限のものしか入ってないのかと思いましたね。。。
というわけでDockerfileに書きましょう。
# PDO driver(MySQL)
RUN docker-php-ext-install -j$(nproc) pdo_mysql
先ほどと同じDockerfileに追記してください。
buildした後、phpinfo();
のPDO driver項目を見るとmysql
が追加されていると思います。
他のデータベースを使いたい時も同じようにDockerfileにかけば使用できるでしょう。
PHPのDockerfile全体
今回はUbuntuでなく、Alpineで軽量化しています。
なので皆さんご存知のapt-getは使えず、apkというパッケージマネージャを使う必要があります。
FROM php:7.4.7-fpm-alpine
ARG environment
RUN apk upgrade --update \
&& apk add --update --no-cache oniguruma-dev \
&& apk --no-cache --virtual .build-deps add make g++ gcc re2c autoconf \
&& apk --no-cache add gettext-dev libzip-dev curl-dev \
&& docker-php-ext-install -j$(nproc) gettext mbstring zip opcache ctype json bcmath sockets curl \
&& pecl channel-update pecl.php.net
# PDO(MySQL)
RUN docker-php-ext-install -j$(nproc) pdo_mysql
まとめ
- PHP7.4以上を使う場合はパッケージ
oniguruma
をDockerfileに追記する。 - PDOドライバーはデフォルトでsqliteしか入ってない。