如何防止Dockerfile指令被caching?
在我的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
语句创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