PHPEarth とは
PHPの色々なDockerイメージを公開しているのがPHPEarthです
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の仲間