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

Building php on compile machine,and run it in alpine failed

我尝试使用以下命令构建 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

但是当我在高山 docker 容器上安装目录 /root/testphp 时:

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

和运行php命令在容器中用/usr/local/php/bin/php -v,用sh: /usr/local/php/bin/php: not found

出错了

谁能告诉我为什么它不起作用?我花了很多时间来处理这个 problem.Thanks 很多。

还不完全清楚,但您似乎是在本地 Linux 机器(比如 Ubuntu)上构建 PHP,并试图 运行一个 Alpine 容器。

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

在非 Alpine Linux 上构建和 运行 在 Alpine 上生成的可执行文件通常不会工作,因为 Alpine Linux 使用特殊的 libc(标准 C 库)实现称为 musl libc. musl is not compatible with the GNU C Library - glibc,被大多数其他 Linux 发行版使用,因此对于 Alpine Linux 上的 运行ning 本机软件,它必须针对相同的 musl libc 库构建。

/usr/local/php/bin/php: not found 错误消息非常混乱,假设文件存在很可能是动态 linking 失败造成的。您可以验证使用 ldd /usr/local/php/bin/php.

因此,您必须 link PHP 针对 Alpine 上 运行ning 的 musl C 库,最好是在 Alpine 机器上。

我可以想到以下选项:

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

  2. 继续在您的非 Alpine Linux 机器上构建 PHP,但是 link 它针对 musl libc 二进制文件(通常通过软件包提供),而不是glibc。这可能更难实现,也更容易出现问题,因此不太推荐。

  3. 运行 您在支持 glibc 的 Alpine 容器上构建的 PHP。这是一个相当简单的程序。但是,此选项可能不可行,因为您的 PHP 仍然与原版 Alpine 不兼容,并且开箱即用的 PHP Alpine 用户无法使用。另外,将 glibc 添加到容器中会产生几 MB 的开销,这与您的最小尺寸目标相冲突。

魔道祖师回答:

如果您的 host os 是,比方说,fedora 30 并且您的容器是基于 fedora 30 映像的,那么这可以正常工作。

但话又说回来,我们回到我最初的评论,关于这不是我们使用容器的方式。