在哪里可以找到 docker 图片的 sha256 代码?

Where can I find the sha256 code of a docker image?

我想提取 CentOS 的图像,Tomcat,...使用他们的 sha256 代码,如

docker pull myimage@sha256:0ecb2ad60

但我找不到可以在任何地方使用的 sha256 代码。

我检查了 DockerHub 存储库中是否有任何 sha256 代码的提示,但找不到任何提示。我通过他们的标签下载了图片

docker pull tomcat:7-jre8

并用docker inspect检查图像,看看元数据中是否有sha256代码,但有none(添加图像的sha256代码可能会改变sha256代码)。

我是否必须自己计算图像的 sha256 代码并使用它?

这应该是 Id 字段,您可以在旧 deprecated Docker Hub API

中看到
GET /v1/repositories/foo/bar/images HTTP/1.1
  Host: index.docker.io
  Accept: application/json

Parameters:

namespace – the namespace for the repo
repo_name – the name for the repo

Example Response:

HTTP/1.1 200
Vary: Accept
Content-Type: application/json

[{"id": "9e89cc6f0bc3c38722009fe6857087b486531f9a779a0c17e3ed29dae8f12c4f",
"checksum": "b486531f9a779a0c17e3ed29dae8f12c4f9e89cc6f0bc3c38722009fe6857087"},
{"id": "ertwetewtwe38722009fe6857087b486531f9a779a0c1dfddgfgsdgdsgds",
"checksum": "34t23f23fc17e3ed29dae8f12c4f9e89cc6f0bsdfgfsdgdsgdsgerwgew"}]

但是:不是它现在如何使用new docker distribution
参见 issue 628: "Get image ID with tag name"

The /v1/ registry response /repositories/<repo>/tags used to list the image ID along with the tag handle.
/v2/ only seems to give the handle.

It would be useful to get the ID to compare to the ID found locally. The only place I can find the ID is in the v1Compat section of the manifest (which is overkill for the info I want)

当前(2015 年中)答案是:

This property of the V1 API was very computationally expensive for the way images are stored on the backend. Only the tag names are enumerated to avoid a secondary lookup.
In addition, the V2 API does not deal in Image IDs. Rather, it uses digests to identify layers, which can be calculated as property of the layer and are independently verifiable.

刚看到:

当我拉取图像时,sha256 代码显示在输出的底部(摘要:sha....):

docker pull tomcat:7-jre8
7-jre8: Pulling from library/tomcat
902b87aaaec9: Already exists 
9a61b6b1315e: Already exists 
...   
4dcef5c50d60: Already exists 
Digest: sha256:c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f
Status: Image is up to date for tomcat:7-jre8

这个sha代码

sha256:c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f

之后可以用

拉取镜像

docker pull tomcat@sha256:c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f

这样可以确保镜像没有被更改,可以安全地用于生产。

最新回答

OhJeez 在评论中建议的编辑。

docker inspect --format='{{index .RepoDigests 0}}' $IMAGE

原回答

我相信你也可以使用

docker inspect --format='{{.RepoDigests}}' $IMAGE

仅适用于 Docker 1.9,并且图像最初是由摘要提取的。 Details are on the docker issue tracker.

可以通过docker images --digests

获取
REPOSITORY          TAG    DIGEST                                                                    IMAGE ID     CREATED        SIZE
docker/ucp-agent    2.1.0  sha256:a428de44a9059f31a59237a5881c2d2cffa93757d99026156e4ea544577ab7f3   583407a61900 3 weeks ago    22.3 MB

只要再发出docker pull tomcat:7-jre8,你就会得到你想要的。

除了现有的答案之外,您还可以在执行 docker images 时使用 --digests 选项来获取您拥有的所有图像的摘要列表。

docker images --digests

您可以添加 grep 以进一步向下钻取

docker images --digests | grep tomcat

如@zelphir 所述,使用摘要不是一个好方法,因为它不存在于仅限本地的图像。我假设图像 ID sha 在 tags/pull/push 等

中是最准确和一致的
docker inspect --format='{{index .Id}}' $IMAGE

成功了。

最简单最简洁的方式是:

docker images --no-trunc --quiet $IMAGE

这 returns 只有 sha256:... 字符串,没有别的。

例如:

$ docker images --no-trunc --quiet debian:stretch-slim
sha256:220611111e8c9bbe242e9dc1367c0fa89eef83f26203ee3f7c3764046e02b248

编辑:

注意:这仅适用于本地图像。如果需要,您可以先docker pull $IMAGE

您可以在从相应存储库中拉取图像时找到它。下面的命令在拉取 docker 图像时提到 Digest: sha256。

09:33 AM##~::>docker --version
Docker version 19.03.4, build 9013bf5

摘要:sha256:6e9f67fa63b0323e9a1e587fd71c561ba48a034504fb804fd26fd8800039835d

09:28 AM##~::>docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
7ddbc47eeb70: Pull complete
c1bbdc448b72: Pull complete
8c3b70e39044: Pull complete
45d437916d57: Pull complete
**Digest: sha256:6e9f67fa63b0323e9a1e587fd71c561ba48a034504fb804fd26fd8800039835d**
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

图片下载完成后,我们可以进行以下操作

"ubuntu@sha256:6e9f67fa63b0323e9a1e587fd71c561ba48a034504fb804fd26fd8800039835d"

09:36 AM##~::>docker inspect ubuntu | grep -i sha256
        "Id": "sha256:775349758637aff77bf85e2ff0597e86e3e859183ef0baba8b3e8fc8d3cba51c",
            **"ubuntu@sha256:6e9f67fa63b0323e9a1e587fd71c561ba48a034504fb804fd26fd8800039835d"**
            "Image": "sha256:f0caea6f785de71fe8c8b1b276a7094151df6058aa3f22d2902fe6b51f1a7a8f",
            "Image": "sha256:f0caea6f785de71fe8c8b1b276a7094151df6058aa3f22d2902fe6b51f1a7a8f",
                "sha256:cc967c529ced563b7746b663d98248bc571afdb3c012019d7f54d6c092793b8b",
                "sha256:2c6ac8e5063e35e91ab79dfb7330c6154b82f3a7e4724fb1b4475c0a95dfdd33",
                "sha256:6c01b5a53aac53c66f02ea711295c7586061cbe083b110d54dafbeb6cf7636bf",
                "sha256:e0b3afb09dc386786d49d6443bdfb20bc74d77dcf68e152db7e5bb36b1cca638"

我发现上述方法在某些情况下不起作用。他们要么:

  • 不能很好地处理具有相同哈希值的多个图像(在 .RepoDigests 建议的情况下 - 当您想使用特定的注册表路径时)
  • 将镜像推送到注册表时效果不佳 (在 .Id 的情况下,它是本地哈希,而不是 注册表)。

下面的方法很微妙,但可以为特定的推送容器提取特定的完整 'name' 和哈希值。

场景如下 - 一张图片分别上传到同一存储库中的 2 个不同项目,因此查询 RepoDigests returns 2 个结果。

$ docker inspect --format='{{.RepoDigests}}' gcr.io/alpha/homeapp:latest

[gcr.io/alpha/homeapp@sha256:ce7395d681afeb6afd68e73a8044e4a965ede52cd0799de7f97198cca6ece7ed gcr.io/beta/homeapp@sha256:ce7395d681afeb6afd68e73a8044e4a965ede52cd0799de7f97198cca6ece7ed]

我想使用 alpha 结果,但我无法预测它将是哪个索引。所以我需要操纵文本输出以删除括号并将每个条目放在单独的行上。从那里我可以很容易地得到结果。

$ docker inspect --format='{{.RepoDigests}}' gcr.io/alpha/homeapp:latest | sed 's:^.\(.*\).$::' | tr " " "\n" | grep alpha

gcr.io/alpha/homeapp@sha256:ce7395d681afeb6afd68e73a8044e4a965ede52cd0799de7f97198cca6ece7ed