在编译机上构建php,并在alpine中运行失败

时间:2019-04-25 15:54:59

标签: php linux docker makefile alpine

我尝试使用以下命令构建php7:

./configure --prefix=/root/testphp --with-openssl --enable-zip --enable-mbstring --with-pdo-mysql --enable-static
make
make install

然后我尝试在编译机上运行它,如下所示:

[root@guningvm ~]# /root/testphp/bin/php -v
PHP 7.3.4 (cli) (built: Apr  8 2019 11:25:09) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.4, Copyright (c) 1998-2018 Zend Technologies

但是当我将目录/root/testphp挂载到高山docker容器上时:

docker run -itd --name "testforphp" -v /root/testphp/:/usr/local/php/ alpine:3.7

然后使用/usr/local/php/bin/php -v在容器中运行php命令,而使用sh: /usr/local/php/bin/php: not found出错了

有人能告诉我为什么它不起作用吗?我花了很多时间解决这个问题。非常感谢。

2 个答案:

答案 0 :(得分:1)

尚不完全清楚,但似乎您正在本地Linux机器(例如Ubuntu)上构建PHP,并试图在Alpine容器上运行它。

我还假设您有充分的理由从源代码构建PHP-否则,您可以使用可用的PHP builds for Alpine

在非Alpine Linux上构建并在Alpine上运行生成的可执行文件通常不起作用,因为Alpine Linux使用称为musl libc的特殊libc(标准C库)实现。 musl与大多数其他Linux发行版所使用的GNU C库-glibc不兼容,因此,要在Alpine Linux上运行本机软件,必须基于相同的musl libc库构建。

/usr/local/php/bin/php: not found错误消息非常令人困惑,并且假定文件存在很可能是由于动态链接失败而导致的。您可以使用ldd /usr/local/php/bin/php进行验证。

因此,您必须将PHP与musl C库链接起来,才能在Alpine上运行,最好是在Alpine机器上运行。

我可以想到以下选项:

  1. 在Alpine容器上构建PHP。我不确定主要的PHP开发分支是否支持此功能(例如,OpenJDK Java Alpine支持是在名为IcedTea和Portola的单独项目下开发的),但是值得一试。我相信这是可能的,因为PHP构建是available for Alpine-如果遇到困难,请尝试遵循其build recipe。我认为这是最好的选择。

  2. 请继续在非Alpine Linux机器上构建PHP,但将其链接到musl libc二进制文件(通常可通过软件包获得),而不是glibc。这可能更难以实现,更容易出现问题,因此建议不要这样做。

  3. 在启用了glibc的Alpine容器上运行构建的PHP。这是一个相当简单的过程。但是,此选项可能不可行,因为您的PHP仍然与香草Alpine不兼容,并且PHP Alpine的用户无法直接使用。另外,向容器中添加glibc会产生数MB的开销,这与您实现最小大小的目标相冲突。

答案 1 :(得分:0)

魔鬼拥护者答案:

例如,如果您的主机操作系统是fedora 30,而您的容器是基于fedora 30映像,则此方法可以正常工作。

但是再说一次,我们回到我最初的评论中,关于这不是我们使用容器的方式。