我有一个多层的dockerfile。我将图像构建到构建失败的n
层。然后,我更改代码中的某些内容,从而解决了n
层的生成问题。我知道该代码库,并且知道此特定更改对n-m
层的功能没有任何影响,但是由于基于该代码库,因此该层确实得到了重新构建。我想避免这种重建,而是跳转到n-1
层的缓存并从那里继续构建。这可能吗?
如果我做docker build --cache-from IMAGE_ID_OF_LAYER_n_1
,看起来--cache-from
会被忽略,并且构建将从n-m
层开始。
答案 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-m
,RUN step-n
仍然可以被缓存。最后的程序集仍然必须重复,但这只是复制文件。 (例如,假设有一种设置正在运行webpack
来预编译浏览器应用程序,而您只需要复制其中的dist
树即可。)