也许我的Google Foo不够强大,但我无法找到有关何时缓存中的Docker镜像无效的明确列表。具体来说,我至少在这些情况下感兴趣:
wget foo.com/latest.gz
)?< / LI>
答案 0 :(得分:11)
从Docker 1.8开始,Docker不再使用mtime
来使缓存失效(这在拉取请求中发生了变化#12031)。
构建图像时;
ADD myfiles /somewhere
/ COPY myfiles /somewhere
),docker使用校验和更改使缓存无效ADD http://example.com/foobar /somewhere
),总是下载,但构建缓存基于校验和更改而失效RUN
指令(例如wget foo.com/latest.gz
)永远不会使缓存失效,除非指令被更改;即,高速缓存基于指令中的文本。如果您需要可重现的构建,请确保这些URL指向特定版本(wget http://example.com/package-major.minor.patch.gz
)Docker 1.9引入了对build-time arguments的支持,它允许您传递可以在Dockerfile中使用的变量,这样您就不必编辑Dockerfile来破坏缓存,或者安装不同的版本包裹。
例如
FROM foobar
ARG MAJOR=1
ARG MINOR=0
ARG PATCH=0
ADD http://example.com/package-$MAJOR.$MINOR.$PATCH.gz /
默认情况下会添加http://example.com/package-1.0.0.gz,但会传递&#34; major&#34;,&#34; minor&#34;或&#34;补丁&#34; build-time参数可以覆盖要下载的版本,并使缓存无效;
docker build --build-arg MINOR=2 . Sat Jan 16 13:22:40 2016
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM ubuntu
---> 1c9b046c2850
Step 2 : ARG MAJOR=1
---> Using cache
---> a149d88772ba
Step 3 : ARG MINOR=0
---> Using cache
---> e3dae0189ffd
Step 4 : ARG PATCH=0
---> Using cache
---> 678d7ae33054
Step 5 : ADD http://example.com/package-$MAJOR.$MINOR.$PATCH.gz /
Get http://example.com/package-1.2.0.gz: dial tcp 127.0.0.1:80: getsockopt: connection refused
有关build-cache的更多信息,请阅读文档中的the build-cache section。
此时(安全)更新例如Debian泡到我身上了?
Docker将不自动下载更新的图像,或更新基于它们的图像。但是,如果您docker pull yourbaseimage
,并且下载了较新的映像,则基于该映像的构建缓存无效,因此下一个构建将不使用缓存。
对于Docker hub上的自动构建,您可以确保在更新基础映像时自动重建图像,请参阅documentation on automated builds