我尝试使用以下命令构建 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
挂载到 alpine 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 : 未找到
谁能告诉我为什么它不起作用?我花了很多时间解决这个问题。非常感谢。
最佳答案
还不是很清楚,但您似乎是在本地 Linux 机器(比如 Ubuntu)上构建 PHP,并试图在 Alpine 容器上运行它。
我还假设您有充分的理由从源代码构建 PHP - 否则,您可以使用可用的 PHP builds for Alpine .
在非 Alpine Linux 上构建并在 Alpine 上运行生成的可执行文件通常行不通,因为 Alpine Linux 使用称为 musl libc 的特殊 libc(标准 C 库)实现。 . musl 与 GNU C 库不兼容 - glibc ,被大多数其他 Linux 发行版使用,因此要在 Alpine Linux 上运行 native 软件,它必须针对相同的 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 的开销,这与您的最小尺寸目标相冲突。
关于php - 在编译机上构建 php,并在 alpine 中运行失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55853289/