如何缓存Alpine Linux的python包Docker构建?

时间:2018-05-30 07:30:17

标签: python pandas alpine

一个相关问题问道"为什么Pandas在Alpine Linux上构建缓慢?":

Why does it take ages to install Pandas on Alpine Linux

我想知道如何解决这个问题(答案没有说),即如何缓存Alpine版本以便回收任意编译的python模块在另一个Docker构建中使用。

这样的预建模块可以托管在私人仓库中。 Dockerfile如何获取它?

我对pandas的解决方案特别感兴趣,但将网络扩大更为完美。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

使用不同的“RUN步骤”分离命令,每一步都会尝试使用上一步的缓存,只要一行更改,缓存链无效,并且所有以下行都被执行,所以你要保留缓慢变化的事物在顶部,并经常改变底部。

例如,Dockerfile的内容可以包含:

FROM python:2.7-alpine

RUN apk add --update bash curl
RUN apk add gcc make linux-headers musl-dev openldap-dev libxml2-dev libxslt-dev libffi-dev pcre-dev
RUN apk add cython
RUN pip install pandas
#RUN install your package/library

使用上面的示例,您将看到如下所示的输出行(请注意说“使用缓存”的输出行):

Sending build context to Docker daemon  56.83kB
Step 1/11 : FROM python:2.7-alpine
 ---> b630f364abf4
Step 2/11 : RUN apk add --update bash curl
 ---> Using cache
 ---> a611e4bbdbae
Step 3/11 : RUN apk add gcc make linux-headers musl-dev openldap-dev libxml2-dev libxslt-dev libffi-dev pcre-dev
 ---> Using cache
 ---> 87e91533771d
Step 4/11 : RUN apk add cython
 ---> Using cache
 ---> 47e0fd345aa8
Step 5/11 : RUN pip install pandas
 ---> Running in c57947f606e5

每个“使用缓存”输出行表示上面的行未执行,但结果取自缓存层。

第一次执行所有内容,但在以下执行中会更快(假设主机上的其他内容保持不变)。

现在您可以“docker push:”到您的私有(甚至是公共)注册表,并使用以以下列开头的Dockerfile启动其他构建:

FROM <BASE IMAGE with pandas>:<TAG>

以上称为“父/基础图像”和“构建者”范例,您可以在https://docs.docker.com/develop/develop-images/baseimages/

阅读更多内容

最近,您还可以拥有“多阶段构建”,这实际上是相同的,但是已经简化,因此您可以使用单个Dockerfile:https://docs.docker.com/develop/develop-images/multistage-build/