PHP 7.1 Docker构建未集成pgsql模块问题求助
解决CentOS容器中PHP7.1 pgsql模块未加载及Apache重启问题
我之前在基于CentOS的PHP容器里踩过几乎一模一样的坑,给你梳理几个可行的解决思路:
一、先搞定构建时pgsql模块没加载的核心问题
你说Dockerfile里已经配置了pgsql模块但没生效,大概率是CentOS SCL源的PHP路径特殊性导致的。SCL(Software Collections)里的PHP7.1,配置和模块路径都不是系统默认位置:
- 扩展模块文件存在
/opt/rh/php71/root/usr/lib64/php/modules/ - 配置文件需要放在
/opt/rh/php71/root/etc/php.d/
手动安装php71-php-pgsql后,系统不会自动在这个特殊目录生成加载配置,所以得在Dockerfile里补上这一步:
# 安装pgsql及pdo_pgsql扩展 RUN yum install -y php71-php-pgsql && \ # 手动生成扩展加载配置文件 echo "extension=pgsql.so" > /opt/rh/php71/root/etc/php.d/20-pgsql.ini && \ echo "extension=pdo_pgsql.so" > /opt/rh/php71/root/etc/php.d/20-pdo_pgsql.ini && \ # 清理yum缓存减小镜像体积 yum clean all && rm -rf /var/cache/yum/*
另外还要确保容器里的PHP环境默认指向SCL的7.1版本,不然php -m调用的可能是系统自带的旧版PHP。可以在Dockerfile里加一行:
RUN echo "source /opt/rh/php71/enable" >> /etc/bashrc
这样SSH进容器后,默认shell就会加载PHP7.1的环境变量,php -m就能看到pgsql模块了。
二、手动安装后不重启容器重启Apache的方法
容器里一般没有systemd,不能用systemctl restart httpd,试试这两种优雅的方式:
- 发送HUP信号让Apache热重启
找到Apache的进程ID,发送HUP信号(不会中断现有请求,只是重新加载配置和模块):kill -HUP $(cat /run/httpd/httpd.pid) - 用Apache自带命令重启
如果已经启用了SCL环境,直接执行:
或者直接调用SCL里的httpd完整路径(可以用scl enable php71 -- httpd -k restartwhich httpd查看具体路径):/opt/rh/httpd24/root/usr/sbin/httpd -k restart
额外提醒
尽量把所有依赖安装和配置步骤都写到Dockerfile里,别每次启动容器都手动操作,这样才能保证镜像的一致性和可复用性,避免重复踩坑。
内容的提问来源于stack exchange,提问作者bfuzze
相关产品推荐
相关产品推荐

