如何防止缓存Dockerfile指令?

时间:2015-08-03 08:00:04

标签: caching curl 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
...

使用RUNcurl的{​​{1}}语句会创建自己的图片图层。这将用作以后执行ADD的缓存。

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

在那里工作的缓存失效会很棒。例如。使用HTTP ETags或查询上次修改的标头字段。这样就可以根据HTTP标头进行快速检查,以确定是否可以使用缓存层。

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

4 个答案:

答案 0 :(得分:27)

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

Dockerfile ADD command过去使缓存失效。虽然最近的docker版本中有it has been improved

  

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

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

Issue 1326提到其他提示:

  

这很有用。

RUN yum -y install firefox #redo
  

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

     

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

     

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

答案 1 :(得分:22)

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

ARG CACHE_DATE=not_a_date

然后在每个新构建中为此参数赋予新值。当然,最好的是时间戳。

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

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

查看有关Issue 22832的详细讨论。

答案 2 :(得分:0)

由于某种原因,从构建文件传递参数对我不起作用。我通过将我不想缓存的命令附加到最后一个CMD指令来解决了我的问题。

例如:

CMD ["/bin/bash", "-c" , "python3 /foo.py && bash /bar.sh"]

现在,我正在运行不希望被缓存的foo.py,然后是bar.sh。不干净,但是可以。

答案 3 :(得分:-4)

在命令之后添加&& exit 0将使缓存无效。

示例:

RUN apt-get install -y unzip && exit 0