如何为 Alpine 编译 python?

Posted

技术标签:

【中文标题】如何为 Alpine 编译 python?【英文标题】:How do I compile python for Alpine? 【发布时间】:2017-04-15 00:21:00 【问题描述】:

背景背景(为什么):

我们有一个用 Python 编写的项目,在容器化平台上运行。 我们使用网络文件系统(基于 OpenStack)来存储镜像和挂载,这在时间点恢复方面非常有用,但是 Docker 镜像的大小开始在部署中扼杀我们。

python:2.7-slim 镜像大约 180Mb(加上我们的代码和依赖项大约 200Mb),拉取大约需要 45 秒。 (很多节点!)

我想做的事:

我想从 Python 代码编译一个静态二进制文件,然后我可以在更小的 Alpine 容器上运行它。

目前的进展:

跑步

$ cython --embed app.py
$ gcc -I /usr/lib/python2.7 -o app app.c -lpython2.7

或者

$ pyinstaller -F app.py

生成一个 ELF 二进制文件,可以在一堆东西(Ubuntu/Debian/Fedora/Kali/Arch)上运行。 第一个要求在目标上安装 python-dev,第二个不需要,但通常比第一个慢 1200% 左右,并且我们的一些代码有困难。

龙在哪里:

在 Debian 上编译和运行应用程序可以正常工作。

$ docker run -v `pwd`/app:/app debian:jessie /app
* The application has run successfully...

但 Alpine 似乎失败了。

$ docker run -v `pwd`/app:/app alpine:latest /app
standard_init_linux.go:178: exec user process caused "no such file or directory"

我怀疑这是因为 libc.so.6 的动态要求, 但我似乎无法弄清楚如何在不动态需要 libc 的情况下使用 GCC 创建静态二进制文件?

【问题讨论】:

这可能需要静态编译python,参见wiki.python.org/moin/BuildStatically、***.com/questions/1150373/…、github.com/bendmorris/static-python。我还没试过。 【参考方案1】:

这是因为 alpine 使用 musl libc 并且无论是静态构建还是使用 alpine 构建二进制文件都足以让它运行。但是还有第三个懒惰的选项,它要么安装 glibc,要么更懒惰地使用已经安装了 glibc 的 alpine 映像。这是图片frolvlad/alpine-glibc。

【讨论】:

以上是关于如何为 Alpine 编译 python?的主要内容,如果未能解决你的问题,请参考以下文章

Docker 基础镜像

如何为多个 Python 版本和平台构建编译模块

如何为不同的 OS/Python 版本编译 Python C/C++ 扩展?

如何为 Windows 编译 cymunk?

Rod 在 Docker Alpine 中运行得到错误“chrome-linux/chrome:没有这样的文件或目录”

如何为 python 安装 OpenCV