【问题标题】:Adding extensions to php from a Docker container从 Docker 容器向 php 添加扩展
【发布时间】:2019-03-28 16:32:23
【问题描述】:

我正在使用 Arch Linux 操作系统。

我有一个运行 php 项目的容器,我需要启用 gmp 和 curl 扩展。

我的容器基于 Alpine 映像,我可以使用 docker exec {container-name} apk add php-gmp php-curl 安装扩展。

然后,如果我运行 docker exec {container-name} php -m 来显示我的扩展,控制台将打印 gmpcurl。太好了,这一切都很好,我还在同一个容器内运行的 php.ini 文件中启用了扩展。

但如果我去控制器并返回 extension_loaded('gmp') 它会打印错误!

我错过了什么?

【问题讨论】:

  • 你在用什么? mod_php? PHP-FPM? CLI Web 服务器?您可能需要在相关容器上重新启动 webserver/PHP 进程。
  • 在这种情况下,是的,您可能需要重新启动服务,但最好在 Dockerfile 中添加扩展并重建映像,这样每次都会出现。
  • 感谢您的回复,我做了一些研究,发现我有另一个运行 nginx 的容器,所以正在使用 php-fpm。我现在尝试使用docker build 重建 nginx 容器,这重建了 nginx 容器......但没有区别。然后我发现在为 php-fpm 安装一个包之后,你必须执行sudo /etc/init.d/php-fpm restart,我现在已经从两个容器中尝试过,但无济于事。 nginx 容器有 /etc/init.d 但没有 php-fpm 可执行文件,并且 php 容器没有 /etc/init.d 目录。我觉得我离成功如此之近,我能闻到它的味道。
  • Dockerfiles 显然在导入带有RUN apk add 的依赖包时存在问题,例如。我想我让这部分工作,然后继续解决 Dockerfile 问题。

标签: php docker curl gmp alpine


【解决方案1】:

Jon Stirling 寻求答案。

我需要重新编辑 Dockerfile 以包含 gmpcurl 包,然后还让 Dockerfile 编辑 php.ini 配置文件以包含 gmpcurl 扩展名。

所以:

运行 apk 添加--no-cache \

...{我所有其他的包}...

php-gpm \

php-curl

运行 sed -i 's/extension=gmp.$/extension=gmp/;s/extension=curl.$/extension=curl/;' /etc/php7/php.ini

最后一行使用终端工具 'sed -i' 替换任何匹配 extension=gmpextension=curl 的行,并替换它们所在的整行。

这基本上从 php.ini 文件中取消它们,而无需从目录中复制一个全新的 php.ini 文件。

使用docker-compose build 重新构建整个项目后,再次启动所有内容extension_loaded('gmp') 返回true

【讨论】: