在不提供外部构建参数的情况下在Dockerfile中关闭缓存

时间:2019-04-10 18:59:25

标签: docker dockerfile

我们有一个Dockerfile,在某个位置它不希望发生缓存。

当前我们正在使用

ENV CACHE_BUST=$($RANDOM)

进一步检查后,有趣的东西被缓存了:

Step 1/1 : ENV CACHE_BUST=$($RANDOM) ---> Using cache

在构建步骤中,是否有任何方法可以从Dockerfile内部破坏缓存,而无需传递唯一的build-arg(如日期)?

2 个答案:

答案 0 :(得分:1)

要破坏高速缓存,需要更改输入之一。如果运行的命令相同,则即使该命令具有已更改的外部依赖关系,缓存也会被重用,因为docker无法看到这些外部依赖关系。

解决此问题的选项包括:

  1. 传递可更改的构建参数(例如,将其设置为日期戳)。
  2. 使用COPY或ADD更改包含在图像中的文件。
  3. 使用--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选项。

相关问题