通过HTTP API在Docker中心列出Docker镜像的标签

时间:2016-02-12 11:08:33

标签: docker docker-registry dockerhub

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

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

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

6 个答案:

答案 0 :(得分:2)

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

使用这个全新的版本,会出现一个新的身份验证系统,因此v1.0的基本身份验证将不再适用。

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

由于不推荐使用v1.0,您应该转到注册表v2.0。

答案 1 :(得分:2)

Docker V2 API更新

Docker V2 API需要具有适当声明的OAuth承载令牌。我认为,官方文档对此主题含糊不清。为了使其他人不会像以前那样痛苦,我提供了以下docker-tags函数。

docker-tags的最新版本可以在我的GitHubGist : "List Docker Image Tags using bash"中找到。

docker-tags函数依赖于jq。如果您正在使用JSON,那么您可能已经拥有了。

#!/usr/bin/env bash
docker-tags() {
    arr=("$@")

    for item in "${arr[@]}";
    do
        tokenUri="https://auth.docker.io/token"
        data=("service=registry.docker.io" "scope=repository:$item:pull")
        token="$(curl --silent --get --data-urlencode ${data[0]} --data-urlencode ${data[1]} $tokenUri | jq --raw-output '.token')"
        listUri="https://registry-1.docker.io/v2/$item/tags/list"
        authz="Authorization: Bearer $token"
        result="$(curl --silent --get -H "Accept: application/json" -H "Authorization: Bearer $token" $listUri | jq --raw-output '.')"
        echo $result
    done
}

示例

docker-tags "microsoft/nanoserver" "microsoft/dotnet" "library/mongo" "library/redis"

诚然,docker-tags进行了几个假设。具体来说,OAuth请求参数大多是硬编码的。更加雄心勃勃的实现将向注册表提出未经身份验证的请求,并从未经身份验证的响应派生OAuth参数。

答案 2 :(得分:1)

这是一个Bash脚本。将其保存到名为docker-hub-tags-list的文件中,并按以下方式运行:

docker-hub-tags-list markriggins/todowrangler

但您需要先通过docker login登录。您需要安装JSON工具http://trentm.com/json/,这是一个非常酷的工具,可以在命令行上解析JSON。

#!/usr/bin/env bash

REPOSITORY=${REPOSITORY:-$1}
REGISTRY=${REGISTRY:-docker.io}

#
#  Docker funcs
#
    d__docker_relative_repository_name_from_URL() {
        # Given $REGISTRY/repo/path:tag, return the repo/path
        set +o pipefail
        echo ${1-} | sed -e "s|^$REGISTRY/||" | cut -d: -f1
    }

    d___version_sort() {
        # Read stdin, sort by version number descending, and write stdout
        # It assumes X.Y.Z version numbers

        # This will sort tags like pr-3001, pr-3002 to the END of the list
        # and tags like 2.1.4 BEFORE 2.1.4-gitsha

        sort -s -t- -k 2,2nr |  sort -t. -s -k 1,1nr -k 2,2nr -k 3,3nr -k 4,4nr
    }

    d__basic_auth() {
        #
        # Read basic authentication credentials from `docker login`
        #
        cat ~/.docker/config.json | json '.auths["https://index.docker.io/v1/"].auth'
    }


    d__registry__tags_list() {

        # Return a list of available tags for the given repository sorted
        # by version number, descending
        #
        # Get tags list from dockerhub using the v2 API and an auth.docker token

        local rel_repository=$(d__docker_relative_repository_name_from_URL ${1})
        [ -z "$rel_repository" ] && return

        local TOKEN=$(curl -s -H "Authorization: Basic $(d__basic_auth)" \
                       -H 'Accept: application/json' \
                       "https://auth.docker.io/token?service=registry.docker.io&scope=repository:$rel_repository:pull" | json .token)


        curl -s -H "Authorization: Bearer $TOKEN" -H "Accept: application/json" \
                "https://index.docker.io/v2/$rel_repository/tags/list" |
                json .tags |
                json -a |
                d___version_sort
    }

d__registry__tags_list $REPOSITORY

答案 3 :(得分:1)

私有图像存储库,v2 API

使用香草Bourne Shell(包括但不限于Bash)编写并使用v2 API的可与私有和公共存储库一起使用的版本位于https://gist.github.com/nealey/86da928cdb5c21a4edc1be2ba7b845e3

您可以像这样运行它:

$ docker-tags.sh alpine
$ docker-tags.sh ceph/daemon
$ docker-tags.sh quay.io/coreos/dnsmasq

它列出了所有版本,每行一个。

#! /bin/sh

image="$1"; shift
if [ -z "$image" ] || [ "$image" == "--help" ]; then
    echo "Usage: $0 IMAGE"
    echo
    echo "Prints all tags associated with IMAGE in a docker repository"
    exit 1
fi

case "$image" in
    */*/*)
        host=${image%%/*/*}
        path=${image#*/}
        ;;
    */*)
        host=index.docker.io
        path=$image
        ;;
    *)
        host=index.docker.io
        path=library/$image
        ;;
esac

tags_uri=https://$host/v2/$path/tags/list

##
## Figure out who hands out tokens by doing an unauthenticated request
##
extract () {
    # XXX: This can't handle values with commas in them
    echo -n "$2" | awk -v f="$1" 'BEGIN {RS=","; FS="=\"|\"$";} ($1 == f) { print $2; }'
}
auth=$(curl --silent -I $tags_uri | sed -n 's/^Www-Authenticate: Bearer //p' | tr -d '\r')
if [ -n "$auth" ]; then
    realm=$(extract realm "$auth")
    service=$(extract service "$auth")
    scope=$(extract scope "$auth")
    ## Now fetch a token
    token=$(curl --silent --get --data-urlencode "service=$service" --data-urlencode "scope=$scope" $realm | jq  -r '.token')
    auth_header="Authorization: Bearer $token"
fi

## Finally, list versions
curl -s --header "$auth_header" "$tags_uri" | jq -r '.tags[]'

答案 4 :(得分:1)

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

在手情况下,对于打开的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"
    ]
  },

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

(
  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

我已经在gist中以脚本的形式发布了该文档,任何评论或建议都将不胜感激。

答案 5 :(得分:0)

感谢 Neale Picket 的剧本。 它不适用于私人存储库,因此我对其进行了一些编辑(并修复了标题检测时区分大小写的问题)

这个一开始会询问你的 Dockerhub 用户和密码,并用它来向 Docehuv API 发出和验证请求。

要点:https://gist.github.com/juanlb/b959354cc289dd9962e9f57dee4ac063