为什么Docker Hub在构build映像时caching自动构build存储库?

Docker Hub的自动化版本库似乎不caching图像。 当它正在build设,它将删除所有中间容器。 这是它打算工作的方式还是我做错了什么? 没有必要为每一个小的改变重build所有的东西真的很好。 我认为这应该是docker工人的最佳优势之一,他们的build设者不使用它似乎很奇怪。 那为什么不caching图像?

更新:我已经开始使用Codeship来构build我的应用程序,然后在我的DigitalOcean服务器上运行远程命令来复制构build的文件并运行docker build命令。 我仍然不确定为什么Docker Hub不caching。

免责声明:我是Quay.io(私人Docker容器registry)的首席软件工程师,所以这是基于我们在自己的构build系统实现中遇到的同样问题的有根据的猜测。

鉴于我的Dockerfile构build系统的经验,我会怀疑Docker Hub不支持caching,因为在Docker Engine中实现了caching。 Docker构build的caching操作是通过比较要运行的命令与内存中存在的现有层进行的。

例如,如果Dockerfile具有以下forms:

FROM somebaseimage RUN somecommand ADD somefile somefile 

那么Doc​​ker构build代码将会:

  1. 检查是否存在与somebaseimage匹配的图像
  2. 使用命令RUN somecommand命令检查是否存在本地映像,其父映像是上一映像
  3. 用命令ADD somefile somefile检查是否有本地图像+ ADD somefile somefile内容散列(当somefile发生变化时确认它是无效的),其父图像是前一图像

如果以上任何一个步骤匹配,那么该命令将在Dockerfile构build过程中被跳过,而使用caching的图像本身。 然而,这个过程的一个关键问题是它需要caching的图像出现在构build机器上 ,以便查找和validation匹配。 让所有人在build立节点上图像效率非常低,这是一个难以解决的问题。

在Quay.io中,我们通过创buildDockercaching代码的变体来解决caching问题,该代码可以预先计算这些命令/散列,然后向caching层询问caching层,只有在find最有效的caching后才将其下载到机器组。 这需要在registry代码中进行重大的数据模型更改。

如果您想了解更多信息,我们在本次演讲中给出了技术概述: https : //youtu.be/anfmeB_JzB0?list=PLlh6TqkU8kg8Ld0Zu1aRWATiqBkxseZ9g