我需要在注册表中检查 docker 镜像,而不是在本地拉取它。
具体来说,我需要获取所有的回购标签。相当于当地
docker inspect some-image | jq -r '.[0].RepoTags[]'
更具体一点,对于
some-image:latest
,如果它除了“最新”之外还有一个版本标签
已经有SO问题了,比如这个。提到了Regclient,它重复了官方API返回的内容。至少,我在玩过
curl
、manifests 和 regctl image [manifest|inspect|digest]
之后得到了这样的印象
Medium 上有一段美丽的绿色背景,Inspecting docker image ...。而
curl \
--silent \
--header "Accept: application/vnd.docker.distribution.manifest.v2+json" \
"http://REGISTRY_ADDRESS/v2/$image/manifests/$tag" |
jq -r '.config.digest'
...结果中没有
.config.digest
(甚至.config
)
我针对私有存储库运行它,所以 HTTP API 是我最好的选择
skopeo
命令? skopeo list-tags
命令将允许您列出图像的所有可用标签。例如:
$ skopeo list-tags docker://docker.io/hello-world
{
"Repository": "docker.io/library/hello-world",
"Tags": [
"latest",
"linux",
"nanoserver",
"nanoserver-1709",
"nanoserver-1803",
"nanoserver-1809",
"nanoserver-ltsc2022",
"nanoserver-sac2016",
"nanoserver1709"
]
}
要在注册表中获取 Docker 镜像的所有 repo 标签而不在本地拉取它,您可以使用 Docker Registry HTTP API。
curl -s "http://REGISTRY_ADDRESS/v2/REPO_NAME/tags/list" | jq -r '.tags[]'
具体获取some-image:latest的version tag,可以先用前面的命令获取repository的所有tag列表,然后过滤具体的version tag:
curl -s "http://REGISTRY_ADDRESS/v2/REPO_NAME/tags/list" | jq -r 'map(select(. | test("^some-image:[0-9.]+$")))[0]'