如何为Alpine编译python?

时间:2017-04-15 00:21:01

标签: python gcc docker cython alpine

背景背景(原因):

我们有一个用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...

但阿尔卑斯山似乎失败了。

$ 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的动态要求, 但我似乎无法弄清楚如何使用GCC创建静态二进制文件而不动态需要libc?

1 个答案:

答案 0 :(得分:2)

这是因为alpine使用musl libc并且静态构建或使用alpine构建二进制文件就足以允许它运行。但是有一个第三个懒惰的选择是使用已经安装了glibc的高山图像安装glibc或更懒惰。这是图像frolvlad/alpine-glibc