【发布时间】:2018-11-16 14:19:31
【问题描述】:
我在尝试从我的 docker 容器中使用 pdo 时遇到驱动程序异常。我的图像安装了 php7.1 并启用了 pdo_mysql 扩展。 db 凭据也正确,但我不确定为什么我仍然是这个驱动程序异常:PHP Fatal error: Uncaught PDOException: could not find driver in /var/www/app/test.php:9
我需要启用任何其他扩展吗?
Dockerfile
FROM ubuntu:xenial
# install dependencies
RUN apt-get update
RUN apt-get install -y software-properties-common python-software-properties
RUN apt-get install -y language-pack-en-base
RUN LC_ALL=en_US.UTF-8 add-apt-repository ppa:ondrej/php
# setup php
RUN apt-get update && \
apt-get install -y nginx \
php7.1 \
php7.1-fpm \
php7.1-cli \
php7.1-common \
php7.1-json \
php7.1-opcache \
php7.1-mysql \
php7.1-mbstring \
php7.1-gd \
php7.1-imap \
php7.1-ldap \
php7.1-dev \
php7.1-intl \
php7.1-gd \
php7.1-curl \
php7.1-zip \
php7.1-xml \
curl
RUN phpenmod pdo_mysql
EXPOSE 8000
ENTRYPOINT ["/bin/sh", "./entrypoint.sh"]
docker-compose.yml
version: "3"
services:
app:
image: app:latest
command: start
ports:
- 8000:8000
links:
- db
environment:
DB_DATABASE: mydb
DB_HOST: db
DB_USER: app_user
DB_PASSWORD: abc123
db:
image: mysql:5.7
environment:
MYSQL_DATABASE: mydb
MYSQL_USER: app_user
MYSQL_PASSWORD: abc123
MYSQL_ROOT_PASSWORD: abc123
ports:
- 3306:3306
test.php
<?php
require_once('vendor/autoload.php');
use PDO;
$dns = ":host=".getenv('DB_HOST')."; dbname=".getenv('DB_DATABASE');
echo new PDO($dns, getenv('DB_USER'), getenv('DB_PASSWORD'));
【问题讨论】:
-
您的
DB_HOST是否如您的docker-compose文件中所述指向db?还注意到这个github issue 有类似的问题。他们说要运行RUN docker-php-ext-install pdo pdo_mysql pdo_pgsql -
是的,DB_HOST = db DB_DATABASE = mydb DB_USER=app_user DB_PASSWORD = abc123
-
您可以尝试将github issue 中的行添加到您的dockerfile 中并试一试吗? :)
-
我认为您的问题出在 $dns 变量上,您必须定义数据库驱动程序(在您的情况下为 mysql)。
$dns = "mysql:host=".getenv('DB_HOST')."; dbname=".getenv('DB_DATABASE'); -
我有理由你自己安装等,而不是使用官方的 php 图像? hub.docker.com/_/php你可以使用
docker-php-ext-install安装mysql pdo扩展
标签: php docker ubuntu pdo docker-compose