在alpine中安装gevent的骚操作

起因

周末用Flask框架写了一个Xray的Webhook服务端,其实主要是完成了3个简单的功能,漏洞入库、漏洞推送(钉钉)、记录xray节点信息,并打算将其通过docker部署。

构造Dockerfile过程中基础镜像我选择了python3.7-alpine,在使用pip安装相关的库时发现到gevent时会报错(其实可以不用装gevent,但因为用了gunicorn做WSGI Server并且用了gevent来启服务)

pip install gevent报错

原因是基础镜像中缺少gcc编译器以及相关的依赖包,其实到了这里你可以根据报错一点一点排查出缺少的依赖然后用apk安装,但会导致你的镜像十分臃肿(大),因此在安装完之后我想到了一些其他操作,同样可以完成gevent的安装,并且不会导致镜像变得臃肿。

操作

正常安装gevent

1
2
3
4
5
6
7
8
9
10
# dockerfile文件,当然你也可以在alpine的终端中敲
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
RUN set -x \
&& apk update \
&& apk add --no-cache gcc \
&& apk add --no-cache g++ \
&& apk add --no-cache make \
&& apk add --no-cache libffi-dev \
&& apk add --no-cache openssl-dev \
&& pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r /opt/webhook/requirements.tx

通过安装gcc g++ make libffi-dev openssl-dev后即可安装gevent,但会导致增加部署时长以及镜像大小(200MB+)

copy大法
看到这你就知道了,其实就是从安装好的alpine容器中将gevent打包出来,再去新部署的机器中解压即可,这里测试过是可以使用的,并且镜像也只有40MB

进入/usr/local/lib/python3.7/site-packages将如下文件打包copy到新的镜像中.

1
2
3
4
5
6
7
8
9
gevent
gevent-20.6.2.dist-info
greenlet-0.4.16.dist-info
greenlet.cpython-37m-x86_64-linux-gnu.so
zope
zope.event-4.4.dist-info
zope.event-4.4-py2.7-nspkg.pth
zope.interface-5.1.0.dist-info
zope.interface-5.1.0-py3.7-nspkg.pth

这里之所以还要放zope是因为我在使用gunicorn起服务时发现报错了,所以也将其加进去了,打包成压缩包后写成dockerfile如下

1
2
3
4
5
COPY . /opt/webhook

RUN set -x \
&& pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r /opt/webhook/requirements.txt \
&& tar zxvf /opt/webhook/gevent_alpine_lib.tar.gz -C /usr/local/lib/python3.7/site-packages/

其中requirements.txt中已经去除了gevent。

虚浮卅

点我gevent_alpine_lib.tar.gz下载(python:3.7-alpine)

交个朋友
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

吹吹牛吗?

微信