在我的 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
future 执行的缓存。
问题:如何禁用该指令的缓存?
如果能在那里工作,那就太好了。例如。通过使用 HTTP ETags或通过查询 last modified header 字段。这样就可以根据 HTTP header 进行快速检查,以确定是否可以使用缓存层。
我知道一些肮脏的技巧可能会有所帮助,例如而是在 RUN
语句中执行下载 shell 脚本。在我们的构建系统触发 docker build
之前,它的文件名将被更改。我可以在该脚本中进行 HTTP 检查。但是我需要将最后使用的 ETag 或 last modified 存储到某个文件中。我想知道这里是否有一些更干净和原生 Docker 功能可以使用。
最佳答案
可以指定构建时参数以从该步骤开始强制中断缓存。例如,在您的 Dockerfile 中,放置
ARG CACHE_DATE=not_a_date
然后在每个新构建中赋予这个参数一个新的值。最好的当然是时间戳。
docker build --build-arg CACHE_DATE=$(date +%Y-%m-%d:%H:%M:%S) ...
确保该值是一个没有空格的字符串,否则 docker 客户端会错误地将其作为多个参数。
详细讨论见 Issue 22832 .
关于caching - 如何防止 Dockerfile 指令被缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31782220/