DockerHub:sha 摘要不匹配

DockerHub: sha digest doesn't match

我想确定 DockerHub 中最新 docker 图像的 sha 摘要:

如果我尝试拉取最新图像,我可以看到摘要

# docker pull mysql:latest
...
Digest: sha256:c93ba1bafd65888947f5cd8bd45deb7b996885ec2a16c574c530c389335e9169
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest

所以摘要是 c93ba1

但是如果我去https://hub.docker.com我会看到

所以有 2 个摘要:511ca265b41c9a355d5c4ec0

此外,如果我尝试提取任何指定的摘要:

# docker pull mysql@sha256:9a355d5c4ec0351a954b11b494c597cd4e6ab2c8a04ce69c5f8332819890c43e
Error response from daemon: manifest for mysql@sha256:9a355d5c4ec0351a954b11b494c597cd4e6ab2c8a04ce69c5f8332819890c43e not found: manifest unknown: manifest unknown
# docker pull mysql@sha256:511ca265b41cabb694fda409b8ae87fb0a83db15cfb8429d581c33c7aafacddf
Error response from daemon: manifest for mysql@sha256:511ca265b41cabb694fda409b8ae87fb0a83db15cfb8429d581c33c7aafacddf not found: manifest unknown: manifest unknown

但是,如果我尝试使用从 pull 命令获得的那个,它会起作用:

docker pull mysql@sha256:c93ba1bafd65888947f5cd8bd45deb7b996885ec2a16c574c530c389335e9169
sha256:c93ba1bafd65888947f5cd8bd45deb7b996885ec2a16c574c530c389335e9169: Pulling from library/mysql
Digest: sha256:c93ba1bafd65888947f5cd8bd45deb7b996885ec2a16c574c530c389335e9169
Status: Image is up to date for mysql@sha256:c93ba1bafd65888947f5cd8bd45deb7b996885ec2a16c574c530c389335e9169
docker.io/library/mysql@sha256:c93ba1bafd65888947f5cd8bd45deb7b996885ec2a16c574c530c389335e9169

我做错了什么? 有没有办法在不拉取图像的情况下获取摘要?

更新: 使用 Docker Desktop 2.2

在 MacO 上再次重复相同的过程
docker pull mysql:8
8: Pulling from library/mysql
...
Digest: sha256:f91e704ffa9f19b9a267d9321550a0772a1b64902226d739d3527fd6edbe3dfe
Status: Downloaded newer image for mysql:8
docker.io/library/mysql:8

然后在 docker 中心

然后

docker image inspect mysql:8
[
    {
        "Id": "sha256:c8ad2be69a220e93826a6308458627b8d5624dc981050fabf950e5de5a7a08a8",
        "RepoTags": [
            "mysql:8"
        ],
        "RepoDigests": [
            "mysql@sha256:f91e704ffa9f19b9a267d9321550a0772a1b64902226d739d3527fd6edbe3dfe"
        ]

docker pull mysql@sha256:a592539c5a616b6642bb48822688b6917b373a1293638f9268e8da33e5e9dd1c
sha256:a592539c5a616b6642bb48822688b6917b373a1293638f9268e8da33e5e9dd1c: Pulling from library/mysql
Digest: sha256:a592539c5a616b6642bb48822688b6917b373a1293638f9268e8da33e5e9dd1c
Status: Downloaded newer image for mysql@sha256:a592539c5a616b6642bb48822688b6917b373a1293638f9268e8da33e5e9dd1c
docker.io/library/mysql@sha256:a592539c5a616b6642bb48822688b6917b373a1293638f9268e8da33e5e9dd1c
docker pull mysql@sha256:f91e704ffa9f19b9a267d9321550a0772a1b64902226d739d3527fd6edbe3dfe
sha256:f91e704ffa9f19b9a267d9321550a0772a1b64902226d739d3527fd6edbe3dfe: Pulling from library/mysql
Digest: sha256:f91e704ffa9f19b9a267d9321550a0772a1b64902226d739d3527fd6edbe3dfe
Status: Image is up to date for mysql@sha256:f91e704ffa9f19b9a267d9321550a0772a1b64902226d739d3527fd6edbe3dfe
docker.io/library/mysql@sha256:f91e704ffa9f19b9a267d9321550a0772a1b64902226d739d3527fd6edbe3dfe

当我在 Linux VM 上执行相同操作时:

sudo docker pull mysql:8
8: Pulling from library/mysql
...
Digest: sha256:f91e704ffa9f19b9a267d9321550a0772a1b64902226d739d3527fd6edbe3dfe
Status: Downloaded newer image for mysql:8
docker.io/library/mysql:8

所以我不知道这里发生了什么

奇怪的是,当我访问 dockerhub 时,mysql:latest(现在)有一个不同的摘要,它报告为一个月前更新:

https://hub.docker.com/layers/mysql/library/mysql/latest/images/sha256-a65e1689b806ccb757887565a3c1d8e7467f14621012d472076cad4117eb06f3

在您的示例中,c93va1 是适合您的体系结构的正确散列。你在使用 Mac 吗?其他哈希值(如果有效)用于 ARM 和 AMD64 上的 Linux 的图像。这可以解释您看到的差异吗?

我发现 dockerhub 在处理清单时不太理想。 Google Container Registry 显示图像的清单以及哈希,因此更容易证实。

查看我遇到的一个相关问题的答案,希望对您有所帮助:

根据 this github comment,显然 CLI 在计算 sha256 摘要时使用包含所有不同机器架构选项的清单,而 DockerHub 页面上的每个摘要都是使用仅包含特定个体的清单计算的架构。

更新: 我已经有一段时间没查到这个了,所以我不记得细节了,但要了解更多信息,请查看 this page我相信它与图像清单的 sha 和 清单列表的 sha 之间的区别有关...

当图像被打包为 multi-platform 图像时(即使该打包只有一个平台),您在拉取图像时看到的是清单列表或 OCI 索引的摘要。要使用问题中的示例:

$ regctl manifest get mysql@sha256:f91e704ffa9f19b9a267d9321550a0772a1b64902226d739d3527fd6edbe3dfe --format body | jq .
{
  "manifests": [
    {
      "digest": "sha256:a592539c5a616b6642bb48822688b6917b373a1293638f9268e8da33e5e9dd1c",
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "platform": {
        "architecture": "amd64",
        "os": "linux"
      },
      "size": 2828
    }
  ],
  "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
  "schemaVersion": 2
}

这是一个 docker 清单列表,其中包含一个特定于平台的清单(针对 linux/amd64),其中包含您在 Docker Hub 上看到的摘要 sha256:a592539c5a616b6642bb48822688b6917b373a1293638f9268e8da33e5e9dd1c。 Docker 在拉取时跟踪清单列表,但在拉取到 docker 引擎时它总是将 multi-platform 图像取消引用到单个平台。

在部署中固定摘要时,您通常希望使用 multi-platform 摘要。这允许在不同的平台上使用相同的摘要,尽管在这种特定情况下这不太重要。要获得该摘要,可以使用 regclient、crane 和 skopeo 等工具。并且 buildx 还包含一个隐藏命令 docker buildx imagetools inspect 可以做到这一点。

这不是一项功能,它有一个未解决的 long-running Github 问题 here,您可以在其中参与并投票以更快地修复它。

在 SO 上的类似问题中,您还可以找到一个使用 curl 的解决方法脚本,它会让您正确地 server-side 摘要:

否则 CLI 仍然与 Hub 不同步,甚至 docker inspect。例如:

Docker 中心 (link):

bitnami/minideb:buster
Digest:sha256:b4d0417f742c591cad881ba5458719edb2b8166103413ffc4e1e480455892097

对比本地 docker inspect:

IMAGE_NAME_TAGGED=bitnami/minideb:buster && docker inspect $IMAGE_NAME_TAGGED | grep sha
        "Id": "sha256:0def18b69c0b60f4d4ceb22f5aad596dffbb6d1b6089aff15158a4cde5276e2d",
            "bitnami/minideb@sha256:0a96a8ec61c52b638c824bc3463c9009844d80d5e2b1dfe77b6c10a31a27684d"
                "sha256:4c16ec6258b6cd4630c3d8e7c1389981064e2719d560d5f08b9cfff1082fa86f"

我不确定切换到 podman 是否会改善情况,因为在 this 重新打开的问题中,用户描述了摘要不匹配的类似问题。