Docker 图像构建(摆脱依赖)

Docker Image Build (Get rid of Dependencies)

我正在从 php:7.2-fpm-alpine 的基础图像构建一个 php docker 图像,其中需要一些自定义 php 扩展。

喜欢下面的命令来安装依赖和一些额外的扩展。

RUN apk upgrade --update && apk add libpng-dev libjpeg-turbo-dev \
 freetype-dev libbz2 libxml2-dev libxml2 bzip2-dev libxslt libxslt-dev \
 && docker-php-ext-install bcmath calendar gd hash zip pdo_mysql

因为我需要为我的扩展手动安装依赖项,所以编译它得到类似 bcmath.so gd.so 的东西。

我在想我是否可以摆脱这些依赖关系并将 *.so 复制到新图像中,因为我打算在 Dockerfile 中使用多阶段构建。

问题是我可以摆脱 GCC+ 编译器和一些其他依赖项(openssl、curl)吗?并将编译后的结果添加到新图像中?

在主机操作系统上创建一个目录。 使用 Docker Volume 将你的目录挂载到容器,到你的 *.so 应该被找到的地方。

一旦你编译了扩展,你至少应该能够摆脱 -dev 包。 -dev 包包括诸如 c 源头文件 (.h) 之类的内容。

因此在您的示例中,您安装了 libxml2-dev 和 libxml2。在这种情况下,libxml2 包是 运行 代码所需的文件,libxml2-dev 是编译任何使用 libxml2 的代码所需的包。当您编译 PHP 的扩展时,扩展不包含 运行 特定功能的所有二进制文件,它通常依赖于安装在 OS.[=10 上的包=]

您可以摆脱 gcc 和一些支持的东西,但您可能需要经历一个删除包的过程,然后测试是否有任何问题。

也可以删除 PHP 中的一些模块,同样这取决于您的代码及其作用。尽管这超出了我所做的范围,而且我不确定这样做的好处。