Docker环境运行Laravel 8执行migrate提示mysql找不到驱动问题问询
根因分析
- Dockerfile中GD扩展配置使用了PHP 7的废弃参数,PHP 8环境下该步骤执行失败,导致后续的PDO MySQL扩展安装流程中断,扩展未实际编译安装到镜像中
- 未预先安装PHP扩展依赖的系统库,直接执行
docker-php-ext-install也会导致扩展安装失败 - 若未使用
--no-cache参数重新构建镜像,修改后的Dockerfile不会生效,仍会使用存在问题的旧镜像缓存 - 若直接在宿主机执行
artisan migrate命令,调用的是宿主机的PHP环境而非容器内的PHP,也会触发驱动找不到的报错
解决方案
步骤1:修正Dockerfile配置
适配PHP 8的扩展安装规则,先安装系统依赖再安装PHP扩展,修正GD配置参数,修正后的参考配置:
# 指定PHP 8版本,避免latest标签版本漂移 FROM php:8.0-fpm # 安装扩展依赖的系统库 RUN apt-get update && apt-get install -y \ default-mysql-client \ libpng-dev \ libonig-dev \ libxml2-dev \ libzip-dev \ zip \ unzip \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* # 安装PHP扩展 RUN docker-php-ext-install mysqli pdo pdo_mysql mbstring zip exif pcntl # PHP 8下GD扩展配置使用新参数,移除废弃的--with-gd、xx-dir参数 RUN docker-php-ext-configure gd --with-freetype --with-jpeg RUN docker-php-ext-install gd # 设置工作目录 WORKDIR /var/www # 复制项目文件(放到扩展安装之后,避免代码修改导致镜像缓存失效每次都重装扩展) COPY composer.lock composer.json /var/www/ COPY . /var/www # 权限配置 RUN chown -R www-data:www-data . \ && find . -type f -exec chmod 664 {} \; \ && find . -type d -exec chmod 775 {} \; \ && chgrp -R www-data storage bootstrap/cache \ && chmod -R ug+rwx storage bootstrap/cache EXPOSE 9000
步骤2:无缓存重新构建镜像
执行命令清理旧容器并重新构建镜像,避免缓存影响:
docker compose down docker compose build --no-cache
步骤3:启动容器并验证扩展
启动服务后进入容器验证PDO MySQL扩展是否安装成功:
docker compose up -d # 进入app容器验证扩展 docker compose exec app php -m | grep pdo_mysql
输出pdo_mysql即代表扩展安装成功。
步骤4:正确执行migrate命令
必须在容器内执行artisan命令,禁止直接在宿主机执行:
docker compose exec app php artisan migrate
其他可选优化
- MySQL服务的自定义配置挂载路径错误,官方MySQL镜像配置默认读取
/etc/mysql/conf.d/路径下的.cnf文件,可将挂载规则修改为./docker/sqldb/db.cnf:/etc/mysql/conf.d/db.cnf保证配置生效 - 无需在local.ini中手动添加
extension=pdo_mysql.so,docker-php-ext-install安装扩展后会自动生成ini配置文件启用扩展
内容的提问来源于stack exchange,提问作者user15785090
相关产品推荐
相关产品推荐

