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

Laravel应用Docker化遇阻求助:PDO-MySQL驱动等问题

Laravel Docker化问题解决方案

一、修复后的Dockerfile(解决权限、扩展及PDO驱动问题)

直接使用以下经过验证的Dockerfile,覆盖原有版本,可解决你遇到的所有基础问题:

# 适配Laravel 10+的官方PHP-FPM镜像
FROM php:8.2-fpm

# 安装系统依赖(为后续PHP扩展提供支持)
RUN apt-get update && apt-get install -y \
    git \
    curl \
    libpng-dev \
    libonig-dev \
    libxml2-dev \
    zip \
    unzip

# 安装Laravel必需的PHP扩展,包括mbstring、gd、PDO-MySQL
RUN docker-php-ext-install mbstring exif pcntl bcmath gd mysqli pdo pdo_mysql

# 安装Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# 设置项目工作目录
WORKDIR /var/www/html

# 复制本地项目文件到容器
COPY . .

# 修复Laravel存储/缓存目录权限问题
RUN chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache \
    && chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache

# 安装项目依赖(生产环境跳过dev包)
RUN composer install --no-dev --optimize-autoloader

# 生成Laravel配置文件和应用密钥
RUN cp .env.example .env && php artisan key:generate

# 启动PHP-FPM服务
CMD ["php-fpm"]

二、逐个解决你的具体问题

1. 容器目录权限失败

  • 上述Dockerfile通过chown将storage和bootstrap/cache目录所有权转移给PHP-FPM运行用户www-data,并通过chmod设置合理的读写权限,避免了不安全的777权限设置。

2. mbstring和gd扩展无法安装

  • 安装扩展前先安装了对应的系统依赖:libonig-dev(mbstring依赖)、libpng-dev(gd依赖),再使用官方镜像提供的docker-php-ext-install命令安装扩展,这是最稳定的扩展安装方式。

3. PDO-MySQL驱动找不到、扩展无法加载

  • Dockerfile中明确安装了pdo和pdo_mysql扩展,官方镜像会自动在/usr/local/etc/php/conf.d/目录生成扩展配置文件,无需手动复制php.ini.production。
  • 验证扩展加载状态:进入容器后执行php -m | grep pdo_mysql,若输出pdo_mysql则说明加载成功。

三、配合Nginx的完整编排(可选)

如果需要Nginx反向代理,创建docker-compose.yml编排PHP-FPM、Nginx和MySQL:

version: '3.8'

services:
  app:
    build: .
    volumes:
      - ./:/var/www/html
    networks:
      - laravel

  nginx:
    image: nginx:alpine
    ports:
      - "8000:80"
    volumes:
      - ./:/var/www/html
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    networks:
      - laravel

  db:
    image: mysql:8.0
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: laravel
      MYSQL_USER: laravel
      MYSQL_PASSWORD: secret
      MYSQL_ROOT_PASSWORD: secret
    volumes:
      - dbdata:/var/lib/mysql
    networks:
      - laravel

volumes:
  dbdata:

networks:
  laravel:

在项目根目录创建nginx/default.conf:

server {
    listen 80;
    index index.php index.html;
    root /var/www/html/public;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

四、验证步骤

  1. 构建镜像:docker-compose build
  2. 启动容器:docker-compose up -d
  3. 进入PHP容器:docker-compose exec app bash
  4. 检查扩展:php -m | grep -E 'pdo_mysql|mysqli',确认输出两个扩展名称
  5. 访问应用:打开http://localhost:8000,验证Laravel页面正常加载

内容的提问来源于stack exchange,提问作者Simple Fellow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 05:33:20