如何防止Dockerfile指令被caching?

在我的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 ... 

使用curlADDRUN语句创build它自己的图像层。 这将被用作未来执行docker build的caching。

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

在那里得到像caching失效那样的东西,真是太好了。 例如通过使用HTTP ETags或通过查询最后修改的标题字段。 这将有可能基于HTTP标头进行快速检查,以确定是否可以使用caching图层。

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

可以指定构build时间参数来强制中断该步骤之后的caching。 例如,在你的Dockerfile中,放

 ARG CACHE_DATE=not_a_date 

然后在每一个新的构build中给这个论点一个新的价值。 当然,最好的是时间戳。

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

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

请参阅第22832期的详细讨论。

dockerbuild设 – 无caching将使所有的命令caching无效。

用于使caching失效的Dockerfile ADD命令 。 尽pipe最近的Docker版本已经有所改进 :

Docker应该检查通过ADD添加的任何文件,然后决定是否应该使用caching。

所以,如果添加的文件已经改变了,那么caching对于ADD命令应该是无效的。


问题1326提到其他技巧:

这工作。

 RUN yum -y install firefox #redo 

所以看起来像Docker将重新运行该步骤(及其下面的所有步骤),如果我传递给RUN命令的string无论如何改变 – 即使它只是一个评论

dockercaching只用于,只有当他的祖先没有任何改变(这种行为是有道理的,因为下一个命令将添加到前一层的变化)。

如果没有任何改变的字符(所以即使空间足够使caching无效)也使用caching。

添加 在命令之后; exit 0将会使caching无效。

例:

RUN apt-get install -y unzip; exit 0