docker-compose pdo-драйвер mysql не найден

#php #mysql #docker

#php #mysql #docker

Вопрос:

Я пытаюсь настроить свой проект (PHP MYSQL и PDO). Несмотря на то, что я добавил скрипты для установки расширений в свой файл Dockerfile, и каждый раз, когда я собираю его для их установки, я все еще получаю: «Не удалось найти драйвер». Я проверил в phpinfo() , и драйвера там нет. Я удалил все изображения и контейнеры, созданные с нуля. Тот же результат. Есть идеи? В моем файле docker у меня есть следующее:

 FROM php:7.4-apache
RUN apt-get update amp;amp; apt-get upgrade -y
RUN docker-php-ext-install pdo pdo_mysql 
EXPOSE 80
  

и мой docker-compose.файл yaml:

 version: '3.3'
services:
  web:
    build:
      context: ./php
      dockerfile: Dockerfile
    container_name: php74
    depends_on:
      - db
    links:
      - db
    volumes:
      - ./php:/var/www/html/
    ports:
      - 8008:80
  db:
     container_name: mysql8
     command: --default-authentication-plugin=mysql_native_password
     image: mysql:latest
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: root
       MYSQL_DATABASE: realDE
       MYSQL_USER: khaldoun
       MYSQL_PASSWORD: password
     ports:
       - 6033:3306
  

Комментарии:

1. Вы говорите, что перепробовали большинство решений, но на ваш вопрос есть дюжина дубликатов. Вы пробовали их все?

2. @JayBlanchard ответ на отправленный вами дубликат в точности совпадает с моим кодом. И да, я просмотрел большинство из тех, которые смог найти, но безрезультатно.

3. Я только что запустил ваш код, и расширение PDO было установлено. Я не могу воспроизвести вашу проблему.

4. Это то, что меня смущает @JayBlanchard. Теоретически все правильно. Я делал свежие сборки и все

5. Вы уверены, что смотрите на нужную информационную страницу PHP?

Ответ №1:

Для теста, который я выполнил, я сделал следующее:

Dockerfile —

 FROM php:7.4-apache
RUN apt-get update amp;amp; apt-get upgrade -y
RUN docker-php-ext-install pdo pdo_mysql

COPY $PWD/index.php /var/www/html

EXPOSE 80

# start Apache2 on image start
CMD ["/usr/sbin/apache2ctl","-DFOREGROUND"]
  

index.php

 <?php
    phpinfo();
?>
  

запустите команду (я назвал изображение pdo-test):

 docker run --name=pdo-test -p 8080:80  -d pdo-test
  

Как только контейнер был запущен, я перешел к HTTP://localhost:8080/index.php и увидел, что драйвер PDO загружен:

введите описание изображения здесь

Пожалуйста, обратите внимание, что единственное различие между моим файлом Dockerfile и вашим заключается в том, что я скопировал страницу PHP в /var/www/html и добавил команду, которая запускала Apache при запуске контейнера.

Вещи, которые вы должны проверить:

  • правильно ли монтируется том ./php:/var/www/html
  • поскольку у вас нет команды для запуска Apache, убедитесь, что он запускается правильно в контейнере. Я тестировал оба способа, и это запускалось каждый раз, но вы должны запустить контейнер и убедиться, что Apache работает так, как вы ожидаете.

РЕДАКТИРОВАТЬ Я скопировал один из файлов php.ini из контейнера

 docker cp pdo-test:usr/local/etc/php/php.ini-production php.ini
  

и раскомментировал драйверы PDO:

 ;extension=openssl
;extension=pdo_firebird
extension=pdo_mysql
;extension=pdo_oci
;extension=pdo_odbc
extension=pdo_pgsql
;extension=pdo_sqlite
;extension=pgsql
  

Затем я перестроил контейнер, скопировав обновленный файл php.ini:

 FROM php:7.4-apache
RUN apt-get update amp;amp; apt-get upgrade -y
RUN docker-php-ext-install pdo pdo_mysql

COPY $PWD/index.php /var/www/html
COPY $PWD/php.ini /usr/local/etc/php

EXPOSE 80

# start Apache2 on image start
# CMD ["/usr/sbin/apache2ctl","-DFOREGROUND"]
  

Теперь я могу видеть файл php.ini в phpinfo()

введите описание изображения здесь

Комментарии:

1. Я врезался в контейнер. Apache есть. Однако я заметил в phpinfo, что загруженный конфигурационный файл (отсутствует)

2. Так у него нет файла php.ini?

3. Нет, у него есть только php.ini-development и php.ini-production

4. И если вы это сделаете php -m , есть ли pdo_mysql

5. Я только что дважды проверил, и нет активного php.ini, поэтому, возможно, вам захочется скопировать один из этих файлов .ini локально, изменить его, а затем скопировать в нужное место при сборке iamge.