Docker如何计算每个层的哈希值?这是确定性的吗?

Vic*_*der 17 hash commit docker dockerfile

我试图在Docker官方文档中找到这些信息,但没有成功.

在计算每个提交/层的哈希时,Docker会考虑哪些信息?

很明显,Dockerfile中的行是哈希的一部分,当然还有父提交哈希.但是在计算这个哈希时会考虑其他因素吗?

具体的用例:假设我在不同的机器上有两个开发人员,在不同的时间点(因此,不同$ docker build ...的docker 守护进程和不同的缓存)运行在同一个Dockerfile上.该FROM ...指令将为它们提供相同的起点,但每个操作的结果散列是否会产生相同的散列?这是确定性的吗?

rob*_*ich 6

谢谢@thaJeztah。答案在https://gist.github.com/aaronlehmann/b42a2eaf633fc949f93b#id-definitions-and-calculations中

  1. layer.DiffID:单个图层的ID

    计算:DiffID = SHA256hex(未压缩的图层tar数据)

  2. layer.ChainID:图层及其父级的 ID。该ID唯一标识由一组层组成的文件系统。

    计算方式:

    • 对于底层:ChainID(layer0)= DiffID(layer0)
    • 对于其他层:ChainID(layerN)= SHA256hex(ChainID(layerN-1)+“” + DiffID(layerN))
  3. image.ID:图像的ID。由于映像配置引用了映像使用的层,因此此ID包含文件系统数据和其余映像配置。

    计算:SHA256hex(imageConfigJSON)

  • 嗨@robrich,我验证了你的第三点。这很简单,因为 imageConfigJSON 是一个文件。在 ubuntu 虚拟机上,我执行了:sha256sum -b longFileName.json。而且它与 id 匹配。id 是 longFileName 本身。对于第 1 点,我获得了图层文件夹内的 tar(layer.tar) 文件的哈希值 (sha256sum layer.tar)。现在我不太清楚pont 2。什么是chain id? (2认同)