为什么 docker 镜像哈希码不可重现(特别是“从头开始”)

问题描述 投票:0回答:1

我正在使用以下 Dockerfile 构建一个空映像:

FROM scratch

我在多种环境下尝试过。我得到一个 imageID

71de1148337f
471a1b8817ee
。这是为什么 ?为什么有两个不同的哈希码?它与时间戳无关(我会收到超过 2 个 ID)。

docker dockerfile hashcode
1个回答
0
投票

对于文字

FROM scratch
,我的 buildx 安装的配置输出(经过哈希处理以获取图像 ID)如下所示:

{"architecture":"amd64","config":{"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"WorkingDir":"/"},"created":null,"history":null,"os":"linux","rootfs":{"type":"layers","diff_ids":null}}

这恰好哈希到

sha256:471a1b8817eefb6569017c1a76f288e0d4e5c8476eb199485c469d0b033168bf
。对于
71de11...
图像,您需要将其推送到公共位置,我可以显示差异,但这很可能是 json 格式的微小变化(例如省略空字段)。

这个极端案例需要注意以下几点:

  • 没有创建时间戳。这通常在 docker 构建中设置,但可能在这种情况下被排除。
  • 没有 rootfs diff_ids。这些是图层,这些图层将在文件上有时间戳。
  • 没有与图层关联的历史条目。每个历史条目还有一个时间戳。

可重复性是一个很好的目标,但对于容器镜像来说却并非易事。在我自己的图像中,我在构建后修改它们以删除变异时间戳和其他数据(例如包安装日志)。 buildkit 团队也开始致力于此,从他们在一些最新版本中对 SOURCE_DATE_EPOC 的支持可见一斑。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.