我想通过HTTP接口列出Docker镜像官方Docker中心的标签,但我有点困惑。因为它们似乎有两个版本:
我设法让他们通过向此端点发送GET请求:https://index.docker.io/v1/repositories/{my-namespace}/{my-repository}/tags
以及基本身份验证凭据。
我不确定其中是否有正确的,但我应该使用哪种?
答案 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)
使用香草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