PHP-FPM Docker容器MySQL驱动缺失问题排查与修复请求
问题描述
为Laravel项目编写生产环境Dockerfile时,遇到MySQL驱动缺失错误,报错信息:
could not find driver (SQL: select * from clients where (telegram_id = something) limit 1)
尝试添加RUN docker-php-ext-install pdo_mysql未解决问题,且该命令执行耗时极久,同时希望优化当前Dockerfile的冗余内容。
一、MySQL驱动缺失修复
问题核心在于扩展安装的时机、依赖配置以及编译效率,调整步骤如下:
正确安装依赖并编译扩展
将扩展编译步骤与依赖安装合并,同时利用多核心编译缩短耗时,修改Dockerfile相关片段:RUN apt-get update && apt-get install -y \ build-essential \ libpng-dev \ libzip-dev\ libonig-dev \ libjpeg62-turbo-dev \ libfreetype6-dev \ locales \ zip \ jpegoptim optipng pngquant gifsicle \ unzip \ git \ curl \ && rm -rf /var/lib/apt/lists/* # 配置GD扩展(满足composer依赖)并安装所需PHP扩展 RUN docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install -j$(nproc) gd pdo_mysql zip- 说明:
-j$(nproc)会调用所有CPU核心参与编译,大幅降低耗时;将apt-get clean合并到依赖安装的RUN中,减少镜像层级。
- 说明:
验证扩展状态
启动容器后执行php -m,查看输出中是否包含pdo_mysql和gd,确认扩展已成功安装。
二、Dockerfile优化建议
合并RUN命令,减少镜像层
原Dockerfile中groupadd、useradd为独立RUN,合并后减少镜像层数,提升构建效率:RUN groupadd -g 1000 www \ && useradd -u 1000 -ms /bin/bash -g www www移除生产环境冗余工具
原配置中的vim属于开发调试工具,生产环境无需保留,直接从apt-get install列表中删除,缩小镜像体积并降低攻击面。优化Composer构建阶段
原composer install使用--ignore-platform-reqs会跳过PHP扩展检查,易导致依赖缺失。建议移除该参数,并在builder阶段安装必要扩展以满足依赖检查:FROM composer:latest as builder WORKDIR /app/ # 安装composer依赖检查所需的GD扩展 RUN apk add --no-cache php8-gd COPY composer.json composer.lock ./ RUN composer install --no-dev --no-scripts调整文件复制顺序,利用Docker缓存
将COPY composer.json composer.lock ./放在builder阶段最前端,仅当composer配置文件变化时才会重新执行composer install,否则直接复用缓存,加快构建速度。
最终优化后的完整Dockerfile
FROM composer:latest as builder WORKDIR /app/ # 安装composer依赖检查所需的PHP扩展 RUN apk add --no-cache php8-gd COPY composer.json composer.lock ./ RUN composer install --no-dev --no-scripts FROM php:8.0.2-fpm RUN apt-get update && apt-get install -y \ build-essential \ libpng-dev \ libzip-dev\ libonig-dev \ libjpeg62-turbo-dev \ libfreetype6-dev \ locales \ zip \ jpegoptim optipng pngquant gifsicle \ unzip \ git \ curl \ && rm -rf /var/lib/apt/lists/* # 配置并安装PHP扩展,使用多核心编译加快速度 RUN docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install -j$(nproc) gd pdo_mysql zip WORKDIR /var/www # 合并用户创建命令 RUN groupadd -g 1000 www \ && useradd -u 1000 -ms /bin/bash -g www www # 先复制vendor,再复制项目文件,利用缓存 COPY --chown=www:www --from=builder /app/vendor /var/www/vendor COPY --chown=www:www . /var/www USER www EXPOSE 9000 CMD ["php-fpm"]
内容的提问来源于stack exchange,提问作者AthonD

