如何防止缓存Dockerfile指令?

h3n*_*rik 30 curl caching docker dockerfile

在我Dockerfile使用curlADD下载最新版本的存档,如:

FROM debian:jessie
...
RUN apt-get install -y curl
...
RUN curl -sL http://example.com/latest/archive.tar.gz --output archive.tar.gz
...
ADD http://example.com/latest/archive2.tar.gz
...
Run Code Online (Sandbox Code Playgroud)

RUN使用curlADD创建自己的图像层的语句.这将用作未来执行的缓存docker build.

问题:如何禁用该指令的缓存?

在那里工作缓存失效之类的东西会很棒.例如,通过使用HTTP ETag或通过查询最后修改的头字段.这样就可以根据HTTP标头进行快速检查,以确定是否可以使用缓存层.

我知道一些肮脏的技巧可以帮助例如在RUN语句中执行下载shell脚本.它的文件名将在docker build我们的构建系统触发之前更改.我可以在该脚本中进行HTTP检查.但后来我需要将最后使用过的ETag最后修改过的文件存储到某个文件中.我想知道是否有一些我可以使用的更干净和原生的 Docker功能,在这里.

Von*_*onC 31

docker build --no-cache会使所有命令的缓存无效.

Dockerfile ADD命令用于使缓存失效.虽然最近的docker版本有所改进:

Docker应该校验通过ADD添加的任何文件,然后决定是否应该使用缓存.

因此,如果添加的文件已更改,则该ADD命令的缓存应该无效.


问题1326提到了其他提示:

这很有效.

RUN yum -y install firefox #redo
Run Code Online (Sandbox Code Playgroud)

所以看起来Docker将重新运行该步骤(以及它下面的所有步骤),如果我传递给RUN命令的字符串无论如何都会发生变化 - 即使它只是一个注释.

仅使用docker缓存,并且仅当他的祖先没有发生任何变化时(此行为才有意义,因为下一个命令会将更改添加到上一层).

如果没有任何已更改的字符,则使用缓存(因此即使空间足以使缓存无效).


Rui*_* Ma 29

可以指定构建时参数从该步骤开始强制中断缓存.例如,在你的Dockerfile中,put

ARG CACHE_DATE=not_a_date
Run Code Online (Sandbox Code Playgroud)

然后在每个新构建上给这个参数一个新的值.当然,最好的是时间戳.

docker build --build-arg CACHE_DATE=$(date +%Y-%m-%d:%H:%M:%S) ...
Run Code Online (Sandbox Code Playgroud)

确保该值是一个没有任何空格的字符串,否则docker客户端将错误地将其作为多个参数.

查看问题22832的详细讨论.

  • 还是更好,用$ RANDOM喂它? (2认同)
  • 这也可以与“podman-compose”和“podman”引擎无根配合使用,而不仅仅是与docker一起使用。谢谢@RuifengMa! (2认同)