docker - Docker镜像缓存失效什么时候发生?

标签 docker

也许我的 Google Foo 不够强大,但是我找不到关于缓存中的 Docker 镜像何时失效的明确列表。具体来说,我至少对这些场景感兴趣:

  • 而失效mtime changes对比 checksum changes 。什么时候适用?它可以处理不同的源路径(例如不同目录中的存储库克隆)吗?
  • 由于更新的基础图像而失效。此时将(安全)更新例如Debian 冒泡给我?
  • 是否有任何显式 API 可供持续集成工具用来告诉 Docker 哪些缓存图像可以重用,哪些不能(例如,由于 wget foo.com/latest.gz)?

最佳答案

从 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但是,默认情况下,传递“主要”、“次要”或“补丁”构建时间参数可以覆盖要下载的版本,并使缓存无效;

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

有关构建缓存的更多信息,请阅读 the build-cache section在文档中。

At which point will (security) updates of e.g. Debian bubble down to me?

Docker 将不会自动下载更新的镜像,或者更新基于它们的镜像。但是,如果您 docker pull yourbaseimage 并下载了较新的镜像,则基于该镜像的构建缓存将失效,因此下一个构建将使用缓存。

对于 Docker hub 上的自动构建,您可以确保在更新基础镜像时自动重建镜像,请参阅 documentation on automated builds

关于docker - Docker镜像缓存失效什么时候发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34814669/

相关文章:

python - 如何在Docker中运行不属于预先构建的Docker镜像的新Jupyter Notebook文件?

docker - 该平台不支持关键字 'integrated security'

docker - 创建pod后如何使Kubectl运行容器

linux - 解析 subdomain.localhost 不适用于 docker swarm

docker - 在容器和主机之间共享文件

docker - 如何在Docker Stack部署上禁用网络生成

docker - 多个 FROM - 这意味着什么

linux - 此计算机未启用 VT-X/AMD-v

docker logs filebeat > file.log 不起作用

wordpress - 无法访问 Docker Wordpress 中出现 Apache ServerName 错误的网站