1

I'm new to Docker. I saw a few similar topics on stackoverflow, but non of the solution posted there helped me.

I have a Dockerfile:

FROM php:8.1.10-apache
RUN apt-get update
RUN docker-php-ext-install mysqli pdo pdo_mysql
COPY php.ini /usr/local/etc/php
RUN service apache2 restart

and a docker-compose.yml file:

version: '3'

services:
  php:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "80:80"
    volumes:
      - C:\apps\doc\src:/var/www/html
      - C:\apps\doc\php.ini:/usr/local/etc/php/php.ini

  db:
    image: mysql:5.7
    # NOTE: use of "mysql_native_password" is not recommended: https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password
    # (this is just an example, not intended to be a production configuration)
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example

  adminer:
    image: adminer
    restart: always
    ports:
      - "8080:8080"

As you can see, pdo_mysql should be installed by Docker, but it't not. Function extension_loaded('pdo_mysql') in php returns false. The extension is enabled in php.ini:

extension=pdo_mysql

The php.ini file is working correctly (I changed some other value like max_execution_time for example, and it's updated in phpinfo(), so php.ini seems to work). It looks like this extension is not "not enabled" but not installed at all. php -m command gives me result like this:

PHP Warning:  PHP Startup: Unable to load dynamic library 'pdo_mysql' (tried: /usr/local/lib/php/extensions/no-debug-non-zts-20210902/pdo_mysql (/usr/local/lib/php/extensions/no-debug-non-zts-20210902/pdo_mysql: cannot open shared
 object file: No such file or directory), /usr/local/lib/php/extensions/no-debug-non-zts-20210902/pdo_mysql.so (/usr/local/lib/php/extensions/no-debug-non-zts-20210902/pdo_mysql.so: cannot open shared object file: No such file or
directory)) in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library 'pdo_mysql' (tried: /usr/local/lib/php/extensions/no-debug-non-zts-20210902/pdo_mysql (/usr/local/lib/php/extensions/no-debug-non-zts-20210902/pdo_mysql: cannot open shared obje
ct file: No such file or directory), /usr/local/lib/php/extensions/no-debug-non-zts-20210902/pdo_mysql.so (/usr/local/lib/php/extensions/no-debug-non-zts-20210902/pdo_mysql.so: cannot open shared object file: No such file or direc
tory)) in Unknown on line 0
[PHP Modules]
Core
ctype
curl
date
dom
fileinfo
filter
ftp
hash
iconv
json
libxml
mbstring
mysqli
mysqlnd
openssl
pcre
PDO
pdo_sqlite
Phar
posix
readline
Reflection
session
SimpleXML
sodium
SPL
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zlib

[Zend Modules]

UPDATE: When I manually run docker-php-ext-install pdo_mysql inside container and then run docker-compose restart it works. But why isn't it installed by Docker automatically?

Przemysław Niemiec
  • 1,704
  • 1
  • 11
  • 14
  • I lately encounted the same issue. I believe the fix was to remove the container with "docker rm -v". Even though the layer in the dockerfile should not be cached if it was changed it acted like it was actually cached. – thephper Sep 04 '22 at 11:52
  • did you read this: https://stackoverflow.com/questions/44603941/how-to-enable-pdo-mysql-in-the-php-docker-image – Lety Sep 04 '22 at 11:53
  • @Lety Yes. My Dockerfile looks similar to the one in the most voted answer there except for the like `COPY apache2.conf /etc/apache2` because I don't have any apache2.conf to copy. – Przemysław Niemiec Sep 04 '22 at 12:00
  • Look at answer with 5 votes and this: https://github.com/docker-library/php/issues/62#issuecomment-300068795 it seems that you should to remove older images and rebuild – Lety Sep 04 '22 at 12:05
  • Did you try to delete the container including volumes with "docker rm -v CONTAINERNAME" and then run docker-compose up again? – thephper Sep 04 '22 at 12:34
  • 1
    "But why isn't it installed by Docker automatically?" -- It is, but you're overwriting the `php.ini` file with a broken version. `extension=pdo_mysql` is incorrect, it should be `extension=pdo_mysql.so`. However, using the proper commands (`docker-php-ext-install` and optionally `docker-php-ext-enable`) you should never need to activate a module through ini file manipulation. – rickdenhaan Sep 04 '22 at 12:58

0 Answers0