【问题标题】:Uncaught PDOException: could not find driver inside docker container未捕获的 PDOException:在 docker 容器中找不到驱动程序
【发布时间】: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


【解决方案1】:

我认为您的问题出在 $dns 变量上,您必须定义 DB 驱动程序(在您的情况下为 mysql)。

$dns = "mysql:host=".getenv('DB_HOST')."; dbname=".getenv('DB_DATABASE');

【讨论】:

    猜你喜欢
    • 2017-05-13
    • 2018-05-27
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    • 2016-09-03
    • 2022-01-23
    相关资源
    最近更新 更多