Docker部署CodeIgniter遇pgsql扩展加载失败问题求助
你遇到的PHP Startup: Unable to load dynamic library 'pgsql'和Call to undefined function pg_pconnect()问题,核心是pgsql扩展没有被正确编译安装,你的Dockerfile里有两个关键错误,我帮你拆解下:
问题根源分析
错误的
docker-php-ext-configure参数
你用了-with-pgsql=/usr/local/lib/php/extension/pgsql,这个路径完全不对——docker-php-ext-configure的--with-pgsql参数需要指向系统中libpq(PostgreSQL的客户端库)的安装路径,而不是PHP的扩展目录。实际上,当你通过apt-get install libpq-dev安装依赖后,官方PHP镜像的docker-php-ext-configure脚本会自动检测到libpq的路径,根本不需要手动指定。错误的路径会导致pgsql扩展编译失败,自然生成不了pgsql.so文件。遗漏了pgsql扩展的安装
你的docker-php-ext-install命令只装了pdo pdo_pgsql,但pg_pconnect()这个函数属于pgsql扩展(不是pdo_pgsql),你没安装这个扩展,所以即使php.ini里开启了extension=pgsql,系统也找不到对应的文件。
另外,Dockerfile里的RUN service apache2 restart是多余的——Docker镜像构建阶段的命令不会影响容器启动后的服务状态,容器启动时Apache会自动启动,这行命令完全没用。
修正后的Dockerfile
把你的Dockerfile改成下面这样:
FROM php:7.4.1-apache # 安装libpq-dev并清理apt缓存,减小镜像体积 RUN apt-get update && apt-get install -y libpq-dev && rm -rf /var/lib/apt/lists/* # 不需要指定--with-pgsql路径,自动检测即可 RUN docker-php-ext-configure pgsql # 同时安装pdo、pdo_pgsql和pgsql扩展 RUN docker-php-ext-install pdo pdo_pgsql pgsql # 复制应用代码和php.ini配置 COPY . /var/www/html COPY php.ini-production /usr/local/etc/php/php.ini # 暴露端口 EXPOSE 80
验证方法
构建镜像并启动容器后,可以通过以下方式确认扩展是否安装成功:
- 进入容器执行
php -m,查看输出列表中是否有pgsql和pdo_pgsql - 访问你的info.php页面,查找pgsql相关的扩展信息
这样修改后,应该就能解决扩展加载失败和函数未定义的问题了。
内容的提问来源于stack exchange,提问作者anexo

