猫でもわかるWebプログラミング

試行錯誤しながらエンジニア(プログラマー)として働く猫のブログ。技術的な話や、働き方の話、読書録とか、試行錯誤している日常の話。

PHPEarth の Docker イメージに PDO をインストールする

f:id:yoshiki_utakata:20191218113334p:plain

PHPEarth とは

PHPの色々なDockerイメージを公開しているのがPHPEarthです

github.com

PHPEarth のイメージにはPDOが入っていない

PHPEarth で公開されているDockerイメージでLumen*1でmigrationのコマンドを入力すると

$ php artisan migrate
In Connection.php line 1267:

  Class 'PDO' not found

ということでPDOが入っていなかった

Dockerfile で確認

PHPEarthで公開されているDockerfileで確認すると

確かに PDO は入っていなさそうだった。

ドキュメントを確認

調べていると下記のドキュメントが見つかった

これを見ると、プリインストールはされてはいないが、サポートはされているようだ。

Dockerfile で追加してみる

ということで、Dockerfile で追加してみる。postgresqlを使う予定なのでpgsqlも追加する。

FROM phpearth/php:7.3-litespeed

# pdoがインストールされていないのでインストールする
RUN apk add --no-cache php7.3-pdo php7.3-pdo_pgsql

# ...以下略

しかし同じようなエラーが出た

php artisan migrate

PHP Warning:  PHP Startup: Unable to load dynamic library 'pdo' (tried: /usr/lib/php/7.3/modules/pdo (Error loading shared library /usr/lib/php/7.3/modules/pdo: No such file or directory), /usr/lib/php/7.3/modules/pdo.so (Error relocating /usr/lib/php/7.3/modules/pdo.so: zend_hash_next_index_insert: symbol not found)) in Unknown on line 0

PHP Warning:  PHP Startup: Unable to load dynamic library 'pdo_pgsql' (tried: /usr/lib/php/7.3/modules/pdo_pgsql (Error loading shared library /usr/lib/php/7.3/modules/pdo_pgsql: No such file or directory), /usr/lib/php/7.3/modules/pdo_pgsql.so (Error relocating /usr/lib/php/7.3/modules/pdo_pgsql.so: php_addcslashes_str: symbol not found)) in Unknown on line 0

PHP Fatal error:  Class 'PDO' not found in /var/lib/litespeed/Example/vendor/illuminate/database/Connection.php on line 1267

In Connection.php line 1267:

  Class 'PDO' not found

モジュールがロードできていないエラーが出ている

  • Unable to load dynamic library 'pdo'
  • Error loading shared library /usr/lib/php/7.3/modules/pdo: No such file or directory

動かない理由を調査する

Error loading shared library /usr/lib/php/7.3/modules/pdo: No such file or directory なのでこのディレクトリを見てみる

/etc # ls /usr/lib/php/7.3/modules
bcmath.so     curl.so       ftp.so        opcache.so    phar.so       simplexml.so  sysvshm.so    xmlwriter.so
bz2.so        dom.so        iconv.so      openssl.so    posix.so      sockets.so    tokenizer.so  zip.so
calendar.so   exif.so       json.so       pdo.so        session.so    sysvmsg.so    xml.so        zlib.so
ctype.so      fileinfo.so   mbstring.so   pdo_pgsql.so  shmop.so      sysvsem.so    xmlreader.so

soファイル自体はあるっぽい

php -m で見てみる

$ php -m
PHP Warning:  PHP Startup: Unable to load dynamic library 'pdo' (tried: /usr/lib/php/7.3/modules/pdo (Error loading shared library /usr/lib/php/7.3/modules/pdo: No such file or directory), /usr/lib/php/7.3/modules/pdo.so (Error relocating /usr/lib/php/7.3/modules/pdo.so: zend_hash_next_index_insert: symbol not found)) in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library 'pdo_pgsql' (tried: /usr/lib/php/7.3/modules/pdo_pgsql (Error loading shared library /usr/lib/php/7.3/modules/pdo_pgsql: No such file or directory), /usr/lib/php/7.3/modules/pdo_pgsql.so (Error relocating /usr/lib/php/7.3/modules/pdo_pgsql.so: php_addcslashes_str: symbol not found)) in Unknown on line 0
[PHP Modules]
bcmath
bz2
calendar
Core
ctype
curl
date
dom
exif
fileinfo
filter
ftp
hash
iconv
json
libxml
mbstring
openssl
pcre
Phar
phpdbg_webhelper
posix
readline
Reflection
session
shmop
SimpleXML
sockets
SPL
standard
sysvmsg
sysvsem
sysvshm
tokenizer
xml
xmlreader
xmlwriter
Zend OPcache
zip
zlib

[Zend Modules]
Zend OPcache

同じようにエラーが表示され、モジュール一覧にPDOは出てこない

php.ini を見る

/etc/php/7.3/conf.dを見ると

$ cat 00_pdo.ini
extension=pdo

こうなっている。普通な気がする。

プリインストールされているやつを適当に見てみると

cat 00_ctype.ini
extension=ctype

特に問題なさそうな気がする。

イメージを削除してやりなおしてみる

docker rmi phpearth/php:7.3-litespeed -f
docker rmi 今ビルドしているイメージ

これやってもまだ同じエラーが出る。

結論

結局解決できなかったのですが、php7.2にしたら解決しました

# https://github.com/phpearth/docker-php/blob/master/docker/7.3-litespeed.Dockerfile
FROM phpearth/php:7.2-litespeed

RUN apk add --no-cache php7.2-pdo php7.2-pdo_pgsql

# 以下略

*1:Laravelの仲間