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

时间:2017-07-21 13:02:58

标签: docker dockerfile

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

问题是,如果图像是例如100mb,那么两个图像都是每个100mb,或者它们是否共享相同的图像并且仅使用100mb而不是200mb?

1 个答案:

答案 0 :(得分:4)

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

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

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

如果您在使用两个版本中的缓存匹配时遇到问题,例如导入大文件和类似文件时间戳的内容不匹配,请考虑创建包含公共文件的中间图像。然后每个项目都可以构建FROM该中间图像。