通过 HTTP API 在 Docker hub 上列出 Docker 镜像的标签

tug*_*erk 6 docker dockerhub docker-registry

我想通过它的HTTP接口列出一个Docker镜像官方Docker hub的标签,但我有点困惑。似乎有两个版本:

我设法通过向此端点发送 GET 请求https://index.docker.io/v1/repositories/{my-namespace}/{my-repository}/tags以及基本身份验证凭据来获取它们。

我不确定其中是否有一个正确的,但我应该使用哪个?

Bri*_*ice 5

我来晚了一点,我搜索了这个问题,列出了同一图像的所有标签(理解摘要),不幸的是,大多数答案只是关于显示推送的任何图像摘要的所有可用标签。

举个例子,对于 open jdk,同一个图像摘要通常会被标记多次:

  {
    "sha256:518f6c2137b7463272cb1f52488e914b913b92bfe0783acb821c216987959971": [
      "11",
      "11-buster",
      "11-jdk",
      "11-jdk-buster",
      "11.0",
      "11.0-buster",
      "11.0-jdk",
      "11.0-jdk-buster",
      "11.0.8",
      "11.0.8-buster",
      "11.0.8-jdk",
      "11.0.8-jdk-buster"
    ]
  },
Run Code Online (Sandbox Code Playgroud)

我无法找到相关的 API v2,似乎 api 公开了标签,但没有详细信息,否则您需要列出每个 blob 清单以通过响应标头获取匹配的摘要Docker-Content-Digest。除非我错过了当有很多标签时对我的用例来说不可用的东西,所以我只是使用常规的dockerhub API 来获取所有标签和 teir 详细信息,并按图像摘要对这些标签进行分组。

(
  url="https://registry.hub.docker.com/v2/repositories/library/openjdk/tags/?page_size=100" ;
  while [ -n "$url" ]; do
    >&2 echo -n ".";
    content="$(curl -s "$url")";
    url=$(jq -r '.next // empty' <<< "${content}");
    echo "$content";
  done;
  >&2 echo;
) | jq -s '[.[].results[]]' \
  | jq 'map({tag: .name, digest: .images[].digest}) | unique | group_by(.digest) | map(select(.[].digest) | {(.[0].digest): [.[].tag]})' \
  > openjdk-tags.json
Run Code Online (Sandbox Code Playgroud)

我已将其作为本要点中的脚本发布,任何评论或建议将不胜感激。


cre*_*ack 2

Docker 对注册表进行了巨大的重构:registry v2.0。

这个全新版本带来了新的身份验证系统,因此 v1.0 的基本身份验证将不再起作用。

您可以在此处找到有关 v2.0 身份验证的更多详细信息: https: //docs.docker.com/v1.6/registry/spec/auth/token/

由于 v1.0 已弃用,您应该继续使用注册表 v2.0。