Caching 如何防止缓存Dockerfile指令?

Caching 如何防止缓存Dockerfile指令?,caching,curl,docker,dockerfile,Caching,Curl,Docker,Dockerfile,在我的Dockerfile中,我使用curl或ADD下载最新版本的存档,如: 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 ... 使用curl或ADD的RUN语句创建自己的图像

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

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
...
使用
curl
ADD
RUN
语句创建自己的图像层。它将用作将来执行
docker build
的缓存

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

如果能在那里运行类似于缓存失效的功能,那就太好了。例如,通过使用或查询上次修改的标题字段。这样就可以基于HTTP头进行快速检查,以确定是否可以使用缓存层

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

将使所有命令的缓存无效

用于使缓存失效。尽管在最近的docker版本中:

Docker应该对通过add添加的任何文件进行校验和,然后决定是否应该使用缓存

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


提到其他提示:

这起作用了

因此,如果我传递给
run
命令的字符串在任何情况下发生更改-即使只是一条注释,Docker似乎也会重新运行该步骤(及其下面的所有步骤)

docker缓存仅在其祖先未更改的情况下使用(此行为有意义,因为下一个命令将向上一层添加更改)

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


添加
&退出0
,命令将使缓存失效

例如:


运行apt get install-y解压并退出0

可以指定一个构建时参数,从该步骤开始强制断开缓存。例如,在Dockerfile中,将

ARG CACHE_DATE=not_a_date
然后在每一个新的构建中给这个参数一个新的值。当然,最好的是时间戳

docker build --build-arg CACHE_DATE=$(date +%Y-%m-%d:%H:%M:%S) ...
确保该值是一个没有空格的字符串,否则docker客户端将错误地将其作为多个参数


请参阅有关的详细讨论

最近的docker版本?这是一年多前的评论:)@Adr我同意。在“docker time”中,这似乎是很久以前的事了。一些提示:
RUN yum-y install firefox#redo
将只与RUN一起工作,因为
#redo
不是dockerfile注释。我不小心用它弄坏了东西,例如,
WORKDIR
…刚刚用Docker版本1.12.0-rc2尝试过,它不起作用,仍然缓存指令或者更好,用$RANDOM?加上时间戳,我们可以100%放心,该值始终是唯一的,此外,如果要在容器中的某个地方使用时间戳信息,时间戳信息也很方便。但是这个解决方案背后的想法是尝试在每次运行构建时提供一个新的值来破坏缓存,这可以通过多种方式实现。只要Docker缓存机制不改变,就可以找到类似的方法。一个好的随机生成器(在宇宙的生命周期内)不应该产生碰撞,并且具有任意高的更改频率。FWIW,
ARG CACHE_DATE=
(没有
非a_DATE
)对我来说就足够了。
docker build --build-arg CACHE_DATE=$(date +%Y-%m-%d:%H:%M:%S) ...