有一个 API 可以做到这一点。 Docker 提供了他们的registry 2 API,最近,发布了 OCI distribution-spec。这包括如何在注册表中查询清单和 blob。在注册表中,您最有可能在 config blob 中查找,它是 json 格式,并且具有您在 docker inspect 中看到的几乎所有相同的字段。
较少涉及的是身份验证,根据注册表的不同,这可能会变得有点复杂。 Docker Hub 使用不记名令牌,因此提取清单和带有匿名不记名令牌的配置的示例脚本如下所示:
#!/bin/sh
ref="${1:-library/ubuntu:latest}"
repo="${ref%:*}"
tag="${ref##*:}"
token=$(curl -s "https://auth.docker.io/token?service=registry.docker.io&scope=repository:${repo}:pull"
\
| jq -r '.token')
digest=$(curl -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \
-H "Authorization: Bearer $token" \
-s "https://registry-1.docker.io/v2/${repo}/manifests/${tag}" \
| jq -r .config.digest)
curl -H "Accept: application/vnd.docker.container.image.v1+json" \
-H "Authorization: Bearer $token" \
-s -L "https://registry-1.docker.io/v2/${repo}/blobs/${digest}" | jq .
有多种工具可以为您执行所有这些 API 调用。我的头顶是:
- RedHat 的 Skopeo
- go-containerregistry 的起重机 CLI
- regclient 的 regctl CLI
作为 regclient 的作者,我有点偏见。生成的命令如下所示:
$ regctl image inspect localhost:5000/library/alpine:latest
{
"created": "2021-08-27T17:19:45.758611523Z",
"architecture": "amd64",
"os": "linux",
"config": {
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/sh"
]
},
"rootfs": {
"type": "layers",
"diff_ids": [
"sha256:e2eb06d8af8218cfec8210147357a68b7e13f7c485b991c288c2d01dc228bb68"
]
},
"history": [
{
"created": "2021-08-27T17:19:45.553092363Z",
"created_by": "/bin/sh -c #(nop) ADD file:aad4290d27580cc1a094ffaf98c3ca2fc5d699fe695dfb8e6e9fac20f1129450 in / "
},
{
"created": "2021-08-27T17:19:45.758611523Z",
"created_by": "/bin/sh -c #(nop) CMD [\"/bin/sh\"]",
"empty_layer": true
}
]
}