Docker 缓存,它究竟是如何工作的?

Ser*_*rey 7 docker dockerfile

我知道 docker 将每个图像存储在层中。如果我在一台开发服务器上有多个用户,并且每个人都运行相同的 Dockerfile,但将图像存储为user1_myapp. 并且 user2 将其存储为user2_myapp. 现在,他们再次使用相同的 Dockerfile。

问题是,如果图像是例如 100mb,两个图像每个都占用 100mb,还是共享相同的图像并且只使用 100mb 而不是 200mb?

BMi*_*tch 7

是的,如果您满足先决条件,这两个图像将共享相同的层。Docker 层的重用与生成的图像名称无关。使用缓存层而不是创建新层的要求是:

  • 构建命令需要针对存在上一个图像缓存的同一个 docker 主机运行。
  • 缓存层和正在运行的构建步骤之间的前一层 ID 必须匹配。
  • 当前正在运行的命令或源上下文(如果您正在运行COPYADD)必须相同。Docker 不知道您是否正在运行从外部更改资源(例如git cloneapt-get update)中提取的命令,这可能导致错误的缓存命中。
  • 您不能在构建命令中禁用缓存。

请记住,层是不可变的,一旦创建它们就永远不会改变,只是在运行不同的构建时用具有新 ID 的不同层替换。当您运行一个容器时,它会使用一个特定于该容器的写时复制 RW 层,这允许多个容器和图像在缓存命中时指向相同的图像层。

如果您在使缓存在两个构建中匹配时遇到问题,例如导入一个大文件并且文件时间戳不匹配,请考虑创建一个包含公共文件的中间映像。然后每个项目都可以构建FROM该中间映像。