DockerHub:sha 摘要不匹配

Kan*_*anu 9 docker dockerhub

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

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

# docker pull mysql:latest
...
Digest: sha256:c93ba1bafd65888947f5cd8bd45deb7b996885ec2a16c574c530c389335e9169
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
Run Code Online (Sandbox Code Playgroud)

所以摘要是 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
Run Code Online (Sandbox Code Playgroud)
# docker pull mysql@sha256:511ca265b41cabb694fda409b8ae87fb0a83db15cfb8429d581c33c7aafacddf
Error response from daemon: manifest for mysql@sha256:511ca265b41cabb694fda409b8ae87fb0a83db15cfb8429d581c33c7aafacddf not found: manifest unknown: manifest unknown
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试使用从 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
Run Code Online (Sandbox Code Playgroud)

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

更新: 使用 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
Run Code Online (Sandbox Code Playgroud)

然后在码头集线器上 在此处输入图片说明

然后

docker image inspect mysql:8
[
    {
        "Id": "sha256:c8ad2be69a220e93826a6308458627b8d5624dc981050fabf950e5de5a7a08a8",
        "RepoTags": [
            "mysql:8"
        ],
        "RepoDigests": [
            "mysql@sha256:f91e704ffa9f19b9a267d9321550a0772a1b64902226d739d3527fd6edbe3dfe"
        ]
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)

当我在 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
Run Code Online (Sandbox Code Playgroud)

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

xdh*_*ore 11

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

IMO,这是不必要的混乱,应该调整两者之一,以便它们匹配或标记得更好。

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


BMi*_*tch 7

当镜像被打包为多平台镜像时(即使该打包只有一个平台),您在提取镜像时看到的是清单列表或 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
}
Run Code Online (Sandbox Code Playgroud)

这是一个 docker 清单列表,其中包含单个平台特定清单(适用于 linux/amd64)以及sha256:a592539c5a616b6642bb48822688b6917b373a1293638f9268e8da33e5e9dd1c您在 Docker Hub 上看到的报告摘要。Docker 会跟踪拉取时的清单列表,但在拉取到 Docker 引擎时,它总是将多平台映像取消引用到单个平台。

在部署中固定摘要时,您通常希望使用多平台摘要。这允许相同的摘要可以在不同的平台上使用,尽管在这种特定情况下这不太重要。为了获得摘要,可以使用 regclient、crane 和 skopeo 等工具。buildx 还包含一个docker buildx imagetools inspect可以执行此操作的隐藏命令。