Dockercaching,它是如何工作的?

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

问题是,如果图像是100MB,两幅图像都是100MB,还是共享相同的图像,只用100MB而不是200MB?

是的,如果您满足先决条件,这两个图像将共享相同的图层。 Docker图层独立于结果图像名称重用。 使用caching图层而不是创build新图层的要求是:

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

请记住,图层是不可变的,一旦创build,它们永远不会改变,当您运行不同的构build时,用不同的图层replace为新的ID。 运行容器时,它使用特定于该容器的写入时复制RW层,允许多个容器和图像在获取高速caching命中时指向相同的图像层。

如果在两个版本中获取caching匹配时遇到问题,例如导入大文件,而文件时间戳不匹配,请考虑创build一个包含公共文件的中间映像。 那么每个项目都可以FROM该中间图像构build。