如何从头开始构建一个仅有 Python 程序和基本 Python 解释器的 Docker 容器镜像?

如何从头开始构建一个仅有 Python 程序和基本 Python 解释器的 Docker 容器镜像?

无需 Alpine、Ubuntu、Debian、CentOS、yum、apt、apk、pip 等 - 只需运行 Python 程序所需的最低要求。当然,它可能还需要从 requirements.txt 文件中安装。

需要明确的是,多阶段构建就可以了,只要最终的图像包含要运行的 Python 程序、Python 解释器及其所需的所有库等以及其他 Python 要求。

答案1

实际上,只包含应用程序二进制文件是可能的(至少对于 GoLang 静态二进制文件而言),从安全角度来看,这是非常合理的。如果您希望对 python 执行相同操作,则需要将 python 代码编译为二进制文件,但请记住 glibc 仅具有向后兼容性。因此,如果您决定使用 cpython 或 pyinstaller 编译 python 代码 - 您需要知道容器主机操作系统版本并在其上进行编译(在最新的 Fedora 上进行编译,在 RHEL 6 上不起作用;))。

将 Python 代码转换为二进制文件后,您可以使用 Dockerfile 复制二进制文件并在容器内启动它。然后像往常一样构建容器。

下面是一个如何通过以下方式构建最小容器的示例建设者

答案2

最接近 Python 的是谷歌的distroless 项目它使用运行特定解释器所需的最少资源来构建 docker 镜像。话虽如此,我还是有点质疑这个目标,因为是的,攻击者可能没有 shell 或软件包安装程序,但他们仍然有一个完整的解释器(在本例中是 python)可用于他们的攻击。

请注意,如果没有 shell,您将无法使用字符串语法RUN,并且 python 将无法将 shell 发送到主机,因此这种方法也可能会导致某些问题。

如果您改用可以将结果打包成单个静态二进制文件的编译语言(C、C++ 和 Go 等),那么您将拥有一个更安全的环境,因为容器内攻击者唯一可以使用的工具就是应用程序本身。如果您可以在将容器中的根文件系统设置为只读并将任何挂载的卷设置为 noexec 的情况下运行该二进制文件,那就更好了,这样攻击者就无法将自己的二进制文件推送到容器内运行。

相关内容