我们有一个Dockerfile,在某个位置它不希望发生缓存。
当前我们正在使用
ENV CACHE_BUST=$($RANDOM)
进一步检查后,有趣的东西被缓存了:
Step 1/1 : ENV CACHE_BUST=$($RANDOM)
---> Using cache
在构建步骤中,是否有任何方法可以从Dockerfile内部破坏缓存,而无需传递唯一的build-arg
(如日期)?
答案 0 :(得分:1)
要破坏高速缓存,需要更改输入之一。如果运行的命令相同,则即使该命令具有已更改的外部依赖关系,缓存也会被重用,因为docker无法看到这些外部依赖关系。
解决此问题的选项包括:
--no-cache
选项运行构建。由于您不想执行选项1,因此可以在特定行上执行选项3,但前提是您可以将Dockerfile分为两部分。第一个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创建一个新的前端,该前端允许您注入显式的缓存中断或导致缓存中断的唯一变量。
答案 1 :(得分:0)
您可以在ADD
的开头添加Dockerfile
层,并从稳定的源下载一些动态页面。图像将始终在不使用缓存的情况下重建。
仅以Dockerfile
为例:
FROM alpine:3.9
ADD https://google.com cache_bust
RUN apk add --no-cache wget
p.s。我相信您知道docker build --no-cache
选项。