我尝试使用以下命令构建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
出错了
有人能告诉我为什么它不起作用吗?我花了很多时间解决这个问题。非常感谢。
答案 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机器上运行。
我可以想到以下选项:
在Alpine容器上构建PHP。我不确定主要的PHP开发分支是否支持此功能(例如,OpenJDK Java Alpine支持是在名为IcedTea和Portola的单独项目下开发的),但是值得一试。我相信这是可能的,因为PHP构建是available for Alpine-如果遇到困难,请尝试遵循其build recipe。我认为这是最好的选择。
请继续在非Alpine Linux机器上构建PHP,但将其链接到musl libc二进制文件(通常可通过软件包获得),而不是glibc。这可能更难以实现,更容易出现问题,因此建议不要这样做。
在启用了glibc的Alpine容器上运行构建的PHP。这是一个相当简单的过程。但是,此选项可能不可行,因为您的PHP仍然与香草Alpine不兼容,并且PHP Alpine的用户无法直接使用。另外,向容器中添加glibc会产生数MB的开销,这与您实现最小大小的目标相冲突。
答案 1 :(得分:0)
魔鬼拥护者答案:
例如,如果您的主机操作系统是fedora 30,而您的容器是基于fedora 30映像,则此方法可以正常工作。
但是再说一次,我们回到我最初的评论中,关于这不是我们使用容器的方式。