如何绕过更改的层并跳转到下一层的缓存

时间:2019-04-06 20:21:52

标签: docker

我有一个多层的dockerfile。我将图像构建到构建失败的n层。然后,我更改代码中的某些内容,从而解决了n层的生成问题。我知道该代码库,并且知道此特定更改对n-m层的功能没有任何影响,但是由于基于该代码库,因此该层确实得到了重新构建。我想避免这种重建,而是跳转到n-1层的缓存并从那里继续构建。这可能吗?

如果我做docker build --cache-from IMAGE_ID_OF_LAYER_n_1,看起来--cache-from会被忽略,并且构建将从n-m层开始。

1 个答案:

答案 0 :(得分:1)

这是不可能的。 Docker build cache的工作原理是根据先前的图像和此步骤中的操作计算哈希,其中包括任何ADD版或COPY版文件的实际内容。

例如,如果您有

FROM some/base         # 00000000
RUN step-l             # 11111111
RUN step-m --option-a  # 22222222
RUN step-n             # 33333333

然后,最后一行缓存的内容是“图像22222222,加上RUN step-n,产生图像33333333”。但是如果您随后更改

FROM some/base         # 00000000
RUN step-l             # 11111111
RUN step-m --option-b  # 44444444
RUN step-n

然后,缓存中没有“图像44444444加上RUN step-n”的所有内容。

如果您的步骤非常不同,则可以利用多阶段构建功能

FROM some/base AS build-m
RUN step-m --option-a

FROM some/base AS build-n
RUN step-n

FROM some/base
COPY --from=build-m /opt/m /opt/m
COPY --from=build-n /opt/n /opt/n

然后,即使您更改了RUN step-mRUN step-n仍然可以被缓存。最后的程序集仍然必须重复,但这只是复制文件。 (例如,假设有一种设置正在运行webpack来预编译浏览器应用程序,而您只需要复制其中的dist树即可。)