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

标签 php linux docker makefile alpine-linux

我尝试使用以下命令构建 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 机器上运行。

我可以想到以下选项:

  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 的开销,这与您的最小尺寸目标相冲突。

关于php - 在编译机上构建 php,并在 alpine 中运行失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55853289/

相关文章:

linux - 转换 key :value to CSV file

从 docker 容器到主机超时的 curl 请求

docker - Kubernetes Pods 和 Docker Compose(s) (Composures?) 有什么区别?

docker - 无法通过 Kubernetes 从 GitHub 拉取公共(public) docker 镜像包

php - 准备好的声明不起作用

php - 如何使用带有htmlentities的富文本区域并控制数据库的长度

基于语言环境的 php 输出时间

javascript - 带有多个对象的php请求json jquery

c - unix域套接字VS命名管道?

mysql - bash 中如何解析另一个命令的输入?我们如何重定向错误并传递输入?