#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_mysql5. Я только что дважды проверил, и нет активного php.ini, поэтому, возможно, вам захочется скопировать один из этих файлов .ini локально, изменить его, а затем скопировать в нужное место при сборке iamge.