我在哪里可以找到 sha256码头图像的代码?

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

docker pull myimage@sha256:0ecb2ad60

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

我在 DockerHub 存储库中查找了 sha256代码的任何提示,但是没有找到任何提示。我按照他们的标签下载了图片

docker pull tomcat:7-jre8

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

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

167781 次浏览

这应该是 Id 字段,您可以在旧的 不赞成 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

例子回应:

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


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

但是: 这是 没有的工作方式,现在与 一个 href = “ https://github.com/docker/distribution”rel = “ norefrer”> new docker distribution
参见 第628期: “获取带标记名称的图像 ID”

/v1/注册表响应 /repositories/<repo>/tags用于列出图像 ID 和标记句柄。
/v2/似乎只能给出把手。

将 ID 与本地找到的 ID 进行比较将是有用的。我能找到 ID 的唯一地方是在清单的 v1Compat部分(这对于我想要的信息来说是过分的)

目前(2015年年中)的答案是:

V1API 的这个属性在计算上非常昂贵,因为图像是存储在后端的。只枚举标记名称以避免二次查找。
此外,V2API 不处理图像 ID。相反,它使用摘要来标识层,这些层可以作为层的属性进行计算,并且是可独立验证的。

看到了:

当我提取一个图像时,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

这个沙代码

Sha256: c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f

可以用来拉图像后,与

Docker pull tomcat@sha256: c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f

通过这种方式,您可以确保映像不会被更改,并且可以安全地用于生产。

最新答案

在评论中由 OhJesus 建议进行编辑。

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

原始答案

我相信你也可以得到这个使用

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

只能在 Docker 1.9中工作,如果图像最初是由摘要提取的

你可以通过 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,你就会得到你想要的。

除了现有的答案,您可以使用 --digests选项同时做 docker images获得所有图像的摘要列表。

docker images --digests

您可以添加一个 grep 来进一步深入

docker images --digests | grep tomcat

正如@zelphir 所提到的,使用摘要并不是一种好方法,因为它不适用于仅局部的映像。我假设图像 ID sha 在标记/拉/推等方面是最准确和一致的。

docker inspect --format='\{\{index .Id}}' $IMAGE

有用。

最简单明了的方法是:

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

这只返回 sha256:...字符串,没有其他内容。

例如:

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

编辑:

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

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

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"

我发现上述方法在某些情况下不起作用:

  • 不能很好地处理具有相同散列的多个图像(在。RepoDigists 建议-当您想使用特定的注册表路径时)
  • 将图像推送到注册表时不能正常工作 (在. Id 的情况下,它是一个本地哈希,而不是 注册处)。

下面的方法很微妙,但是可以提取特定推送容器的特定完整‘ name’和 hash。

下面是场景-一个图像被分别上传到同一个回购中的两个不同的项目,因此查询 RepoDigest 会返回两个结果。

$ 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:^.\(.*\).$:\1:' | tr " " "\n" | grep alpha


gcr.io/alpha/homeapp@sha256:ce7395d681afeb6afd68e73a8044e4a965ede52cd0799de7f97198cca6ece7ed