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

How do I cache a python package Docker build for Alpine Linux?

一个相关问题问"Why is a Pandas build slow on Alpine Linux?":

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

这样的预建模块可以托管在私人仓库中。 Docker文件如何获取这个?

我对 pandas 的解决方案特别感兴趣,但将网络撒得更广一点就更好了。

感谢大家的帮助。

使用不同的命令,"RUN steps",每一步都会尝试使用上一步的缓存,只要一行发生变化,缓存链就会失效,并执行后面的所有行,所以你希望将缓慢变化的东西放在顶部,而频繁变化的东西放在底部。

例如,您的 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

在上面的示例中,您将看到如下输出行(注意显示 "Using cache" 的行):

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

每个 "Using cache" 输出行表示紧接在上面的行没有被执行,而是从缓存层中获取的结果。

第一次执行所有内容,但在后续执行时会快得多(假设主机上其他所有内容保持不变)。

现在您可以 "docker push :" 到您的私人(甚至 public)注册表并使用以以下内容开头的 Dockerfile 启动其他构建:

FROM <BASE IMAGE with pandas>:<TAG>

以上称为 "parent / base images" 和 "builder" 范式,您可以在 https://docs.docker.com/develop/develop-images/baseimages/

阅读更多内容

最近,您还可以使用 "multi-stage builds",本质上是相同的,但经过简化,因此您可以使用单个 Dockerfile:https://docs.docker.com/develop/develop-images/multistage-build/