在我的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
...
使用RUN
或curl
的{{1}}语句会创建自己的图片图层。这将用作以后执行ADD
的缓存。
问题:如何禁用该指令的缓存?
在那里工作的缓存失效会很棒。例如。使用HTTP ETags或查询上次修改的标头字段。这样就可以根据HTTP标头进行快速检查,以确定是否可以使用缓存层。
我知道一些肮脏的技巧可以帮助你解决问题。而是在docker build
语句中执行下载shell脚本。在我们的构建系统触发RUN
之前,它的文件名将被更改。我可以在该脚本中进行HTTP检查。但是我需要将最后使用的 ETag 或最后修改的存储到某个文件中。我想知道是否有更多干净的原生 Docker功能,我可以在这里使用。
答案 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