如何绕过更改的图层并跳转到更高图层的缓存



我有一个有很多层的docker文件。我将映像构建到构建失败的第 n 层。然后我在代码中更改了一些内容,以便它解决了第 n 层的构建问题。我知道代码库,我知道这个特定的更改对第 n-m 层的功能没有任何影响,但这一层确实被重建,因为它基于该代码库。我想避免这种重建,而是跳转到第 n-1 层的缓存并从那里继续构建。这可能吗?

如果我docker build --cache-from IMAGE_ID_OF_LAYER_n_1,看起来--cache-from被忽略了,构建从第 n-m 层开始。

是不可能的。 Docker 构建缓存的工作原理是计算上一个图像和此步骤中的操作的哈希,其中包括任何ADD ed 或 COPY ed 文件的实际内容。

例如,如果您有

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-m,仍然可以缓存RUN step-n。 最终的程序集仍然需要重复,但这只是复制文件。 (例如,想象一下运行一个步骤webpack预编译浏览器应用程序的设置,您只需要将其dist树复制到其中。

最新更新