You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP-FPM Docker容器MySQL驱动缺失问题排查与修复请求

问题:Docker环境下Laravel提示MySQL驱动缺失,附Dockerfile优化方案

问题描述

为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驱动缺失修复

问题核心在于扩展安装的时机、依赖配置以及编译效率,调整步骤如下:

  1. 正确安装依赖并编译扩展
    将扩展编译步骤与依赖安装合并,同时利用多核心编译缩短耗时,修改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中,减少镜像层级。
  2. 验证扩展状态
    启动容器后执行php -m,查看输出中是否包含pdo_mysql和gd,确认扩展已成功安装。


二、Dockerfile优化建议

  1. 合并RUN命令,减少镜像层
    原Dockerfile中groupadd、useradd为独立RUN,合并后减少镜像层数,提升构建效率:

    RUN groupadd -g 1000 www \
        && useradd -u 1000 -ms /bin/bash -g www www
    
  2. 移除生产环境冗余工具
    原配置中的vim属于开发调试工具,生产环境无需保留,直接从apt-get install列表中删除,缩小镜像体积并降低攻击面。

  3. 优化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
    
  4. 调整文件复制顺序,利用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 10:53:12