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

Laravel Docker镜像ECS运行时PostgreSQL驱动找不到问题求助

问题分析与解决方案

你的核心问题是容器内存在两套PHP环境,导致运行时调用的PHP未加载PostgreSQL驱动,具体原因和修复步骤如下:

核心原因

你使用的php:8.1-alpine3.17官方镜像本身已经包含完整的PHP(含php-fpm)环境,而你又通过apk安装了php${PHP_VERSION}-fpm等系统PHP包,这会导致容器内同时存在两个独立的PHP环境:

  • 官方镜像的PHP:路径为/usr/local/bin/php,你通过docker-php-ext-install安装的pdo_pgsql驱动属于这个环境
  • 系统安装的PHP:路径为/usr/bin/php,启动命令里的php-fpm81调用的是这个环境,它没有加载PostgreSQL驱动

本地构建运行正常可能是因为本地环境的运行时巧合调用了官方PHP,而Github Actions构建后在ECS上运行时,默认调用了系统PHP,从而触发"could not find driver"错误。

修复步骤:重构Dockerfile

完全移除系统PHP包的安装,基于官方PHP-FPM镜像构建,确保整个容器只有一套PHP环境:

FROM composer:2 as build

WORKDIR /app

COPY . /app

RUN set -ex && \
    composer install \
    --no-scripts \
    --no-autoloader \
    --ansi \
    --no-interaction \
    --no-dev && \
    composer dump-autoload

# 改用官方PHP-FPM镜像,自带完整的PHP-FPM环境
FROM php:8.1-fpm-alpine3.17

RUN apk add --no-cache \
    curl \
    nginx \
    libpq-dev && \
    # 为官方PHP安装PostgreSQL扩展
    docker-php-ext-configure pgsql --with-pgsql=/usr/local/pgsql && \
    docker-php-ext-install pdo pdo_pgsql pgsql && \
    # 清理缓存减小镜像体积
    rm -rf /var/cache/apk/*

# 配置用户与权限(官方镜像已自带www-data,仅补充nginx组关联)
RUN addgroup www-data nginx

WORKDIR /app

COPY --from=build --chown=www-data:www-data /app .

RUN chmod -R 775 storage bootstrap/cache

# 配置nginx相关目录权限
RUN mkdir -p \
    /var/lib/nginx/tmp \
    /var/log/nginx && \
    touch /run/nginx.pid && \
    chown -R www-data:www-data \
    /var/lib/nginx/tmp \
    /var/log/nginx \
    /run/nginx.pid

USER www-data

# 复制nginx配置
COPY docker/nginx/nginx.conf /etc/nginx/nginx.conf
COPY docker/nginx/default.conf /etc/nginx/conf.d/default.conf
# 注意:官方PHP-FPM的配置目录是/usr/local/etc/php-fpm.d/,不是系统的/etc/php81/
COPY docker/php/fpm/www.conf /usr/local/etc/php-fpm.d/www.conf

EXPOSE 8000

# 启动时先清理配置缓存,再启动服务
CMD ["sh", "-c", "php artisan config:clear && php artisan optimize && nginx -g 'daemon off;' & php-fpm"]

额外排查验证项

  1. 确认PHP路径:在ECS容器内执行which php和which php-fpm,确保输出为/usr/local/bin/php和/usr/local/sbin/php-fpm
  2. 验证扩展加载:在调试路由中添加以下代码,确认当前运行的PHP已加载pdo_pgsql:
Route::get('/check-extensions', function () {
    return response()->json([
        'extensions' => get_loaded_extensions(),
        'php_path' => exec('which php')
    ]);
});
  1. 检查日志权限:确保storage/logs目录对www-data用户有写入权限,避免日志无法输出导致排查困难

内容的提问来源于stack exchange,提问作者Eleandro Duzentos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:45:18