我如何编译python的高山?

背景情况(为什么):

我们有一个用Python编写的项目,运行在一个集装箱化的平台上。 我们正在使用networking文件系统(基于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的dynamic需求,但我似乎无法弄清楚如何创build一个静态二进制与GCC没有dynamic需要libc?

这是因为alpine使用musl libc,静态构build或使用alpine构build二进制文件就足以让它运行。 但是还有第三个懒惰的选项,要么安装glibc,要么懒惰地使用已经安装了glibc的高山图像。 这里是frolvlad / alpine-glibc的图片 。