我可以在不下载图像的情况下获取图像摘要吗?

Nat*_*rot 8 docker docker-registry

类似于" Docker图像的sha256代码是什么? "这个问题,我想找到一个Docker镜像的摘要.我下载图片时可以看到摘要:

$ docker pull waisbrot/wait:latest                                                                                                  
latest: Pulling from waisbrot/wait
Digest: sha256:6f2185daa4ab1711181c30d03f565508e8e978ebd0f263030e7de98deee5f330
Status: Image is up to date for waisbrot/wait:latest
$
Run Code Online (Sandbox Code Playgroud)

另一个问题,什么是获取图像摘要的Docker注册表v2 API端点有一个建议Docker-Content-Digest标题的答案.

Docker-Content-Digest当我获取图像的清单时,我可以看到有一个标题:

$ curl 'https://auth.docker.io/token?service=registry.docker.io&scope=repository:waisbrot/wait:pull' -H "Authorization: Basic ${username_password_base64}"

# store the resulting token in DT

$ curl -v https://registry-1.docker.io/v2/waisbrot/wait/manifests/latest -H "Authorization: Bearer $DT" -XHEAD
*   Trying 52.7.141.30...
* Connected to registry-1.docker.io (52.7.141.30) port 443 (#0)
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate: *.docker.io
* Server certificate: RapidSSL SHA256 CA - G3
* Server certificate: GeoTrust Global CA
> GET /v2/waisbrot/wait/manifests/latest HTTP/1.1
> Host: registry-1.docker.io
> User-Agent: curl/7.43.0
> Accept: */*
> Authorization: Bearer LtVRw-etc-etc-etc
>
< HTTP/1.1 200 OK
< Content-Length: 4974
< Content-Type: application/vnd.docker.distribution.manifest.v1+prettyjws
< Docker-Content-Digest: sha256:128c6e3534b842a2eec139999b8ce8aa9a2af9907e2b9269550809d18cd832a3
< Docker-Distribution-Api-Version: registry/2.0
< Etag: "sha256:128c6e3534b842a2eec139999b8ce8aa9a2af9907e2b9269550809d18cd832a3"
< Date: Wed, 07 Sep 2016 16:37:15 GMT
< Strict-Transport-Security: max-age=31536000
Run Code Online (Sandbox Code Playgroud)

但是,这个标题是不一样的.该pull命令让我6f21和标题显示128c.此外,pull命令不适用于该摘要:

$ docker pull waisbrot/wait@sha256:128c6e3534b842a2eec139999b8ce8aa9a2af9907e2b9269550809d18cd832a3                               
Error response from daemon: manifest unknown: manifest unknown
Run Code Online (Sandbox Code Playgroud)

当我有正确的摘要时,事情按我想要的方式工作:

$ docker pull waisbrot/wait@sha256:6f2185daa4ab1711181c30d03f565508e8e978ebd0f263030e7de98deee5f330                                 12:46  waisbrot@influenza
sha256:6f2185daa4ab1711181c30d03f565508e8e978ebd0f263030e7de98deee5f330: Pulling from waisbrot/wait
Digest: sha256:6f2185daa4ab1711181c30d03f565508e8e978ebd0f263030e7de98deee5f330
Status: Image is up to date for waisbrot/wait@sha256:6f2185daa4ab1711181c30d03f565508e8e978ebd0f263030e7de98deee5f330
Run Code Online (Sandbox Code Playgroud)

我正在寻找的是一种将latest标签(一直在变化)转换为可以可靠拉动的固定摘要的方法.但是我不想实际将它拉下来进行翻译.

Arv*_*vin 17

这就是您今天使用 V2 清单执行此操作的方法。

docker manifest inspect <REMOTE IMAGE>:<TAG> -v
Run Code Online (Sandbox Code Playgroud)

您的输出是 JSON:

{
  ...
  "Descriptor": {
        "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
        "digest": "sha256:d13e102941a9f7bd417440f62f9cb29de35f6acb13a26cbf6a34f4c7340f0b63",
        "size": 3255,
        "platform": {
            "architecture": "amd64",
            "os": "linux"
        }
  },
  ...
}
Run Code Online (Sandbox Code Playgroud)

  • 值得一提的是,如果您执行类似的操作,它对于列表清单可以正常工作,但对于 FAT 清单则不然,而后者是您仅使用一个平台构建时所得到的。因此,请避免这种情况:'docker buildx imagetools inform &lt;REMOTE IMAGE&gt;:&lt;TAG&gt; --raw' (5认同)
  • 要仅获取摘要值,您可以使用 `jq`: `docker Manifest Inspect &lt;REMOTE IMAGE&gt;:&lt;TAG&gt; -v | jq -r '.Descriptor.digest'` (2认同)

Oll*_*lli 12

尝试

docker inspect --format='{{index .RepoDigests 0}}' waisbrot/wait
Run Code Online (Sandbox Code Playgroud)

背景:此论坛链接正在讨论同一问题.

问题是服务器选择的默认内容类型是application/vnd.docker.distribution.manifest.v1+prettyjws(v1清单),你需要v2清单.因此,您需要将Accept标头设置为application/vnd.docker.distribution.manifest.v2+json.

  • 如果不下载图像,第一个*不*工作。 (8认同)

小智 5

2个http请求就可以获取到。第一个获取身份验证令牌,第二个获取按架构和变体的图像摘要列表:

token=$(curl --silent "https://auth.docker.io/token?scope=repository:$image:pull&service=registry.docker.io"  | jq -r '.token')

curl -s --header "Accept: application/vnd.docker.distribution.manifest.list.v2+json" --header "Authorization: Bearer ${token}" "https://registry-1.docker.io/v2/$image/manifests/$tag" | jq -r '.manifests|.[]| "\(.digest) \(.platform.architecture) \(.platform.variant)"'

Run Code Online (Sandbox Code Playgroud)

示例:

image=library/nginx
tag=stable-alpine
Run Code Online (Sandbox Code Playgroud)
sha256:8853c7e938c2aa5d9d7439e698f0e700f058df8414a83134a09fcbb68bb0707a amd64 null
sha256:dbcd23f95b94018fe72bfdb356e40f4ae8b95063883f3456fedaed1c02204ed4 arm v6
sha256:d3670edcd50bb07cae303767426adf9bc7ba0219736148d30e6f30dd4e08695c arm v7
sha256:0bcd76faa141e4fa37e875834b3994261e0cfc94b7233ac84896381315b845ca arm64 v8
sha256:da8e62ddb3fab89ff4fa0271dbe230f849ab53402a71338503952437dcda1026 386 null
sha256:269bf99e100294b6b75fbdecf7b4ddbef8b29ea0a953e2e904452a50dbc923ab ppc64le null
sha256:103da50956034c157abeffbc869e2e38a4fabbf913bed8ae6ae7c59e646b28a1 s390x null
Run Code Online (Sandbox Code Playgroud)


wsa*_*ams 5

我最近遇到一个任务,需要查看 sha256 摘要,而不必拉取图像。skopeo工具会调用注册表 API,因此您无需拉取映像。

例如,

$ skopeo inspect --creds "username:password" docker://waisbrot/wait:latest
Run Code Online (Sandbox Code Playgroud)

jq如果您只想获取摘要值,则可以通过管道将其传递给。

$ skopeo inspect --creds "username:password" \
  docker://waisbrot/wait:latest | jq -r '.Digest'
sha256:6f2185daa4ab1711181c30d03f565508e8e978ebd0f263030e7de98deee5f330
Run Code Online (Sandbox Code Playgroud)