在没有提供外部构建args的情况下,在Dockerfile中创建缓存区域

问题描述 投票:1回答:2

我们有一个Dockerfile,在某一点上不希望发生缓存。

目前我们正在使用

ENV CACHE_BUST=$($RANDOM)

经过进一步检查,足够有趣,可以缓存:

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

有没有办法从Dockerfile内部破坏缓存而不在构建步骤中传递一个独特的build-arg(如日期)?

docker dockerfile
2个回答
1
投票

要破坏缓存,其中一个输入需要更改。如果正在运行的命令相同,即使命令具有已更改的外部依赖项,也将重用缓存,因为docker无法看到这些外部依赖项。

解决此问题的选项包括:

  1. 传递更改的构建arg(例如,将其设置为日期戳)。
  2. 使用COPY或ADD更改包含在图像中的文件。
  3. 使用--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创建一个新的前端,它允许你注入一个显式的缓存中断,或者导致缓存中断的唯一变量。


1
投票

您可以在ADD的开头添加Dockerfile图层,从稳定的源代码下载一些动态页面。无需使用缓存即可重新构建映像。

只是Dockerfile的一个例子:

FROM alpine:3.9
ADD https://google.com cache_bust
RUN apk add --no-cache wget

附:我相信你知道docker build --no-cache选项。

© www.soinside.com 2019 - 2024. All rights reserved.