Docker部署PHP+Apache+MySQL报could not find driver错误求解
问题:Docker 部署 Apache+PHP 环境访问提示 could not find driver 错误
被该问题困扰已4小时,尝试了Stack Overflow上所有可找到的相关方案均未生效。
访问容器内的Apache服务时,页面返回错误:could not find driver(找不到驱动)
怀疑该问题与PDO有关,参考的教程使用的是sqlite数据库,虽已在Dockerfile中添加PDO扩展安装配置,但问题仍未解决。
当前配置
docker-compose.yml 配置
services: php-apache-environment: container_name: php-apache build: context: . dockerfile: Dockerfile depends_on: - db volumes: - ./src:/var/www/html/ ports: - 8000:80 db: container_name: db image: mysql restart: always environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: bitchan MYSQL_USER: bit_academy MYSQL_PASSWORD: bit_academy ports: - "9906:3306" phpmyadmin: image: phpmyadmin/phpmyadmin ports: - '8080:80' restart: always environment: PMA_HOST: db depends_on: - db
Dockerfile 配置
FROM php:8.0-apache RUN apt-get update && apt-get upgrade -y RUN docker-php-ext-install pdo pdo_mysql && docker-php-ext-enable pdo pdo_mysql RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli
index.php 数据库连接逻辑
$conn = (require "./db/connectdb.php")(); try { $stmt = $conn->prepare("SELECT * FROM boards"); $stmt->execute(); $boards = $stmt->fetchAll(); $stmt = $conn->prepare("SELECT posts.*, b.board_name, b.shorthand FROM posts JOIN boards b on b.id = posts.board_id ORDER BY modified_at DESC LIMIT 5;"); $stmt->execute(); $posts = $stmt->fetchAll(); } catch (PDOException $e) { echo $e->getMessage(); }
connectdb.php 代码
<?php return function () { $servername = "db:3306"; $username = "bit_academy"; $password = "bit_academy"; try { $conn = new PDO("mysql:host=$servername;dbname=bitchan", $username, $password); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { echo $e->getMessage(); } return $conn; } ?>
项目目录结构

解决方案
核心原因:修改Dockerfile后未重新构建镜像,当前运行的容器基于未安装pdo_mysql扩展的旧镜像生成,因此报找不到驱动错误。按以下步骤操作修复:
- 停掉当前运行的所有容器:
docker-compose down - 强制无缓存重新构建php-apache镜像,避免复用旧镜像层:
docker-compose build --no-cache php-apache-environment - 后台启动所有服务:
docker-compose up -d
额外配置修正:你的PDO连接串配置不规范,host字段不需要带端口,端口需单独声明,容器内部网络直接用服务名db作为主机名即可(默认互通3306端口),将connectdb.php中的连接代码修改为:
$conn = new PDO("mysql:host=db;dbname=bitchan;port=3306", $username, $password);
如果操作后仍报错,进入php-apache容器执行php -m,查看已加载扩展列表中是否存在pdo_mysql项,确认扩展正常加载即可。
内容的提问来源于stack exchange,提问作者Artemixed
相关产品推荐
相关产品推荐

