如何为 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?的主要内容,如果未能解决你的问题,请参考以下文章
如何为不同的 OS/Python 版本编译 Python C/C++ 扩展?