码头工人图像层ID如何派生

时间:2020-04-22 13:47:32

标签: docker

试图了解docker图像层ID是如何到达的。

在基于Linux的VM上,我按如下所示提取ubuntu 20.04映像。

docker pull ubuntu:20.04

然后我将其保存为tar文件,然后将其解压缩。

docker save ubuntu:20.04> ubuntu2004.tar
tar -xvf ubuntu2004.tar

我已经在VM上安装了一个文件夹,所以现在我在Windows机器上看到解压缩的tar,如下所示。

Docker layer structure

您可能知道4个文件夹包含图像的4层。看起来很长的文件夹名称是层的ID。在这些文件夹中,我们可以看到一个json文本文件,其中有一个json对象。此Json对象也具有该层的相同ID。因此ID为1c87ad44cc6b364480a5340ab1050b8dfb1691ed2abc85a1dbc3ee2fb5f2cf06

问题:这些ID如何到达?

以下总结了我在这方面所做的研究。

  1. 我读过一个article,说它们是随机生成的。

用于存储层内容的diff目录现在以一个随机生成的“缓存ID”命名,并且Docker引擎维护该层与其缓存ID之间的链接,以便它知道在何处定位该层内容。磁盘。

我启动了多个VM,提取了相同的ubuntu:20.04映像,然后将其提取以最终发现各层ID完全相同。因此,我得出结论,主机VM上的docker引擎一定不能随机生成这些ID。它必须使用某种逻辑来生成这些ID。或从中提取资源的存储库必须已经具有这些ID。

Jessica G here深入docker层并说了同样的话,即层ID是随机生成的。

每个步骤中,创建的图层均以其随机生成的ID表示。

  1. 在我遇到的这个article中,描述了chainid。首先,我能够按照此处所述正确评估imageId和diffids。现在为chainIds。对于最底层,它说链ID与差异ID相同。

对于底层:ChainID(layer0)= DiffID(layer0)

对于其他层:ChainID(layerN)= SHA256hex(ChainID(layerN-1)+“” + DiffID(layerN))

我观察到,对于任何层,该ID与diff ID不同。我是我想念这里的东西。否则此帖子可能会过时。

  1. Graham Jenson在this帖子中的结论是“文件名和文件夹结构无关紧要”。滚动到最后,您会看到的。

所以直到现在,我仍无法了解docker引擎如何生成id。还是当它们被推送时在存储库中生成它们,而docker引擎将它们原样拉出?我从shell script所描述的Moby Project看了here。它将图层的id生成为图像图层sha的sha256。首先获取layer.tar文件的sha256。我再次猜想sha是从该sha获得的,并用作该层的id。但是这里的问题是该层ID与提取后发现的ID不匹配。

任何正确方向的指针将不胜感激。

0 个答案:

没有答案