我在哪里可以找到 docker 镜像的 sha256 代码?

Posted

技术标签:

【中文标题】我在哪里可以找到 docker 镜像的 sha256 代码?【英文标题】:Where can I find the sha256 code of a docker image? 【发布时间】:2015-11-09 20:25:11 【问题描述】:

我想使用它们的 sha256 代码提取 CentOS、Tomcat 等的图像,例如

docker pull myimage@sha256:0ecb2ad60

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

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

docker pull tomcat:7-jre8

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

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

【问题讨论】:

我在 dockerhub 上创建了一个与此相关的问题 - github.com/docker/docker/issues/17670 【参考方案1】:

最新答案

OhJeez 在 cmets 中建议的编辑。

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

原答案

我相信你也可以使用

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

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

【讨论】:

至少对我来说,这也适用于不是通过摘要提取的图像,而是通过标签。 Docker 18.09.7 就是这样。 Windows下请使用双引号 --format="..." (github.com/docker/toolbox/issues/433#issuecomment-188790050) 看完这篇文章后,可能还想看看下面的帖子。 ***.com/questions/56364643/… 获得 remote sha 真是太好了。您可能还需要下面的另一个答案来获得 local sha。【参考方案2】:

您可以通过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 images --format '.Digest'。这在 foreach 语句中很有用,可以对摘要完成一些工作。【参考方案3】:

最简单最简洁的方法是:

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

这仅返回sha256:... 字符串,不返回任何其他内容。

例如:

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

编辑:

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

【讨论】:

这是真正的仅限本地--quiet 打印的校验和并不是真正的摘要,无法从 Docker Hub 中提取,并且与其他答案打印的校验和不同。见github.com/docker/hub-feedback/issues/…。 这个!这是避免工作难题的一个非常重要的部分。使用它来获取您刚刚构建的 LOCAL sha,然后将此 sha 与要推送图像的 REMOTE sha 进行比较(见上文),看看您是否可以完全跳过该操作。太棒了! (其他解决方案在本地不起作用)。【参考方案4】:

刚看到:

当我拉取图像时,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

这样您就可以确保图像没有被更改并且可以安全地用于生产。

【讨论】:

这并不是一个完整的解决方案,因为它只处理在线图像。如果你想要本地图像的 sha256 怎么办? 还有另一个答案(有更多赞成票)可以让您获得本地 SHA。然后,除此之外,还有更多的赞成票,如何在不下载整个图像的情况下获取远程 SHA。【参考方案5】:

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

docker images --digests

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

docker images --digests | grep tomcat

【讨论】:

【参考方案6】:

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

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

以下方法很微妙,但适用于提取特定推送容器的特定完整“名称”和哈希。

这是场景 - 一张图片分别上传到同一个 repo 中的 2 个不同项目,因此查询 RepoDigests 会返回 2 个结果。

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

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

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

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

gcr.io/alpha/homeapp@sha256:ce7395d681afeb6afd68e73a8044e4a965ede52cd0799de7f97198cca6ece7ed 

【讨论】:

我在 Cloud Deploy 中遇到了与 GCR 图像相同的摘要不一致问题。这正是我所需要的。谢谢。【参考方案7】:

这应该是 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

示例响应:

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"

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

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

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

V1 API 的这一属性对于图像存储在后端的方式而言计算量非常大。仅枚举标记名称以避免二次查找。 此外,V2 API 不处理 Image ID。相反,它使用摘要来识别层,可以将其计算为层的属性并且可以独立验证。

【讨论】:

【参考方案8】:

您可以在从相应存储库中提取图像时找到它。下面的命令提到 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"

【讨论】:

【参考方案9】:

正如@zelphir 所提到的,使用摘要不是一个好方法,因为它不存在于仅本地图像中。我假设图像 ID sha 在标签/拉/推等方面是最准确和一致的。

docker inspect --format='index .Id' $IMAGE

成功了。

【讨论】:

【参考方案10】:

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

【讨论】:

以上是关于我在哪里可以找到 docker 镜像的 sha256 代码?的主要内容,如果未能解决你的问题,请参考以下文章

拉取的 Docker 镜像配置文件在哪里

我在哪里可以在 nativescript android 应用程序中找到 sha1 指纹?

查找 Google Container Registry 公共镜像列表

当我们在 Windows 中使用 docker 镜像和容器时,它存储在哪里?

docker导入镜像报错:invalid diffID for layer xxx: expected “sha256:xxx“, got “sha256:xxx“(文件被更改过)

容器化开发_01_Docker镜像到哪里去下载?Docker镜像下载不下来四种原因?Docker镜像占满磁盘了?