我们有一个Dockerfile,在某一点上不希望发生缓存。
目前我们正在使用
ENV CACHE_BUST=$($RANDOM)
经过进一步检查,足够有趣,可以缓存:
Step 1/1 : ENV CACHE_BUST=$($RANDOM)
---> Using cache
有没有办法从Dockerfile内部破坏缓存而不在构建步骤中传递一个独特的build-arg
(如日期)?
要破坏缓存,其中一个输入需要更改。如果正在运行的命令相同,即使命令具有已更改的外部依赖项,也将重用缓存,因为docker无法看到这些外部依赖项。
解决此问题的选项包括:
--no-cache
选项运行构建。由于您不想执行选项1,因此可以在特定行上执行选项3,但前提是您可以将Dockerfile拆分为2个部分。第一个Dockerfile拥有您现在拥有的所有行,直到您想要中断缓存。然后第二个Dockerfile有一个FROM行依赖于第一个Dockerfile,你使用--no-cache
选项构建它。例如。
Dockerfile1:
FROM base
RUN normal steps
Dockerfile2
FROM intermediate
RUN curl external.jar>file.jar
RUN other lines that cannot be cached
CMD your cmd
然后建立:
docker build -f Dockerfile1 -t intermediate .
docker build -f Dockerfile2 -t final --no-cache .
我能想到的唯一另一个选择是使用BuildKit创建一个新的前端,它允许你注入一个显式的缓存中断,或者导致缓存中断的唯一变量。
您可以在ADD
的开头添加Dockerfile
图层,从稳定的源代码下载一些动态页面。无需使用缓存即可重新构建映像。
只是Dockerfile
的一个例子:
FROM alpine:3.9
ADD https://google.com cache_bust
RUN apk add --no-cache wget
附:我相信你知道docker build --no-cache
选项。