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

时间:2016-03-31 17:04:22

标签: hash docker commit dockerfile

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

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

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

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

1 个答案:

答案 0 :(得分:5)

谢谢@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)