如何在远程注册表上列出Docker映像的所有标签?


Answers:


177

我从这里得到了答案。非常感谢!:)

只需一行脚本:(找到debian的所有标签)

wget -q https://registry.hub.docker.com/v1/repositories/debian/tags -O -  | sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | tr '}' '\n'  | awk -F: '{print $3}'

更新感谢@degelf的建议。这是shell脚本。

#!/bin/bash

if [ $# -lt 1 ]
then
cat << HELP

dockertags  --  list all tags for a Docker image on a remote registry.

EXAMPLE: 
    - list all tags for ubuntu:
       dockertags ubuntu

    - list all php tags containing apache:
       dockertags php apache

HELP
fi

image="$1"
tags=`wget -q https://registry.hub.docker.com/v1/repositories/${image}/tags -O -  | sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | tr '}' '\n'  | awk -F: '{print $3}'`

if [ -n "$2" ]
then
    tags=` echo "${tags}" | grep "$2" `
fi

echo "${tags}"

你可以创建一个新的文件名,dockertags,在/ usr / local / bin目录(或添加PATH环境到你的.bashrc/ .zshrc),并把这些代码在里面。然后添加可执行权限(chmod +x dockertags)。

用法:

dockertags ubuntu --->列出ubuntu的所有标签

dockertags php apache --->列出所有包含'apache'的php标签


1
您可以将整个内容包装在echo [backtick] ...[backtick]中,以将其压缩为一行。和/或用$ 1替换“ debian”,并将其放在/ usr / local / bin下的脚本“ dockertags”中。然后,在结束反引号之前,您可以添加| grep $ 2。然后chmod + x它,然后您可以转到“ dockertags php apache”以查看所有包含apache的php标签。
dagelf '17

8
wget -q https://registry.hub.docker.com/v1/repositories/circleci/ruby/tags -O - | jq -r '.[].name'如果您已jq安装
Tanner,

1
我已经发布了V2 API更新答案
RobV8R

1
sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g'的文字写得更加清晰tr -d '[]" '
William Pursell

1
我修改为使用第二个位置参数作为username:password,以便我可以将wget换成curl并使用userauth="-u ${2}"允许${userauth}(如果它为空,则不切换或设置参数)。这可能会帮助使用私人回购协议的任何人
MrMesees

79

从Docker Registry V2开始,一个简单的GET就足够了:

GET /v2/<name>/tags/list

有关更多信息,请参阅文档


3
根据文档“标签”小节中的信息,此GET似乎需要授权,因此v1 API + sed似乎实际上更易于快速检查...
akavel

3
如果您遇到“未经授权”的错误,请参阅我的替代答案。发布原始答案的人没有冒犯。我不得不采取其他措施才能获得上述答案,并希望为他人提供帮助。
RobV8R

23

如果要使用docker Registry v2 API,它将按页面列出标签。要列出图像的所有标签,您可能想在网址中添加一个大的page_size参数,例如

curl -L -s 'https://registry.hub.docker.com/v2/repositories/library/centos/tags?page_size=1024'|jq '."results"[]["name"]'

2
Docker Hub似乎将page_size限制为有效最大值100。–
Shane

2
@Shane真的吗?我没有遇到这么多页面的图像。网址是否可以https://registry.hub.docker.com/v2/repositories/library/centos/tags/?page=101正常工作?
0xCC

2
java图像是一个很好的例子。是的,您可以执行诸如Registry.hub.docker.com/v2/repositories/library/java/tags/…之类的操作。有关示例,请参见结果中的nextprevious链接。
Shane

19

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

的最新版本docker-tags可以在我的GitHubGist中找到:“使用bash列出Docker映像标签”

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参数。


3
不需要arr=("$@")。只需写docker-tags() { for item; do ....
威廉·珀塞尔

这次真是万分感谢。得到那个令牌使我发疯。
FelicianoTech

17

我设法使用curl使其工作:

curl -u <username>:<password> https://tutum.co/v1/repositories/<username>/<image_name>/tags

请注意,image_name不应包含用户信息等。例如,如果你推命名的图像tutum.co/username/x,然后image_name应该是x



1
您说我应该给他们他们的dockerhub登录名和密码是什么tutum.co网站?
Nakilon

1
@Nakilon几年前,当我写下这个答案时,Tutum是一项提供私有Docker Registry的服务。而且我没有“给他们”密码,而是通过基于HTTP的标准HTTP基本身份验证来使用他们的服务进行身份验证。
约翰

Tutum不再存在。您是否可以更新您的回复,以使人们不会意外地将其凭据发送给现在拥有该域的任何人?
opyh


6

如果有JSON解析工具,jq则可用

wget -q https://registry.hub.docker.com/v1/repositories/debian/tags -O - | \
    jq -r '.[].name'

1
使用引号避免出现jq问题:'.[].name'
Soullivaneuh

1
@Soullivaneuh不加引号可能会发生什么问题?谢谢!
sigjuice

使用zsh时,出现以下错误:no matches found: .[].name。但这在bash上效果很好,也许这是您的默认shell?
Soullivaneuh

@Soullivaneuh谢谢!我在jq命令中添加了引号
sigjuice

4

请参阅CLI实用程序:https : //www.npmjs.com/package/docker-browse

允许枚举标签和图像。

docker-browse tags <image>将列出图像的所有标签。例如docker-browse tags library/alpine

docker-browse images将列出注册表中的所有图像。目前不适用于index.docker.io

您可以将其连接到任何注册表,包括您的私有注册表,只要它支持Docker Registry HTTP API V2



2

您还可以使用以下废料:

# vim /usr/sbin/docker-tags 

&追加关注(原样):

#!/bin/bash
im="$1"
[[ -z "$im" ]] && { echo -e '\e[31m[-]\e[39m Where is the image name ??' ; exit ; }
[[ -z "$(echo "$im"| grep -o '/')" ]] && { link="https://hub.docker.com/r/library/$im/tags/" ; } || { link="https://hub.docker.com/r/$im/tags/" ; }
resp="$(curl -sL "$link")"
err="$(echo "$resp" | grep -o 'Page Not Found')"
if [[ ! -z "$err" ]] ; then
    echo -e "\e[31m[-]\e[39m No Image Found with name => [ \e[32m$im\e[39m ]"
    exit
else
    tags="$(echo "$resp"|sed  -e 's|}|\n|g' -e 's|{|\n|g'|grep '"result"'|sed -e 's|,|\n|g'|cut -d '[' -f2|cut -d ']' -f1|sed  '/"tags":/d'|sed -e 's|"||g')"
    echo -e "\e[32m$tags\e[39m"
fi

使其可执行:

# chmod 755 /usr/sbin/docker-tags

然后最后尝试:

$ docker-tags testexampleidontexist
   [-] No Image Found with name => [ testexampleidontexist ]

$ docker search ubuntu

$ docker-tags teamrock/ubuntu
   latest

[希望您在运行任何命令之前了解$ ]


2
curl -u <username>:<password> https://$your_registry/v2/$image_name/tags/list -s -o - | \
    tr -d '{' | tr -d '}' | sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | \
    awk -F: '{print $3}' | sed -e 's/,/\n/g'

如果您的环境中没有'jq',=,则可以使用它


2

从Docker Hub获取所有标签:此命令使用命令行JSON处理器jqJSONDocker Hub注册表返回的标签中选择标签名称(引号用除去tr)。将替换为Docker Hub用户名,将debian替换为镜像名:

curl -s 'https://registry.hub.docker.com/v2/repositories/library/debian/tags/' | jq -r '."results"[]["name"]'

2
请考虑增加一个小的解释,为什么这个答案的问题,它有什么作用,...
β.εηοιτ.βε

2

这是我为Windows编写的Powershell脚本。处理v1和v2仓库:

Get-DockerImageVersions.ps1:

param (
  [Parameter (Mandatory=$true)]$ImageName,
  [Parameter (Mandatory=$false)]$RegistryURL
)

if (!$RegistryURL) 
{
  $RegistryURL = "https://registry.hub.docker.com/v1/repositories"
}

$list = ""
if ($RegistryURL -like "*v2*") 
{
  $list = "/list"
}

$URL = "$RegistryURL/$ImageName/tags$list"

write-debug $URL
$resp = Invoke-WebRequest -UseBasicParsing $URL | ConvertFrom-Json

if ($RegistryURL -like "*v2*") 
{
  $tags = $resp | select tags
  $tags.tags
} else {
  $tags = $resp | select name
  $tags.name
}

2

您可以通过在终端上运行以下命令来实现:

curl -L -s 'https://registry.hub.docker.com/v2/repositories/library/mysql/tags/' | jq . | grep name

另外,如果您没有jq,则必须通过安装

sudo apt-get install jq

curl -L -s 'https://registry.hub.docker.com/v2/repositories/library/mysql/tags/' | jq .results[].name 将为您节省grep命令
Matson Kepson

使用版本1:curl -L -s 'https://registry.hub.docker.com/v1/repositories/danilobatistaqueiroz/job-wq-1/tags'
danilo

1

当我必须执行一项任务时,如果用户以某种方式键入了错误的标签,那么我们就必须提供该寄存器中存在的repo(Docker repo)中存在的所有标签的列表。所以我在批处理脚本中有代码。

<html>
<pre style="background-color:#bcbbbb;">
@echo off

docker login --username=xxxx --password=xxxx
docker pull %1:%2

IF NOT %ERRORLEVEL%==0 (
echo "Specified Version is Not Found "
echo "Available Version for this image is :"
for /f %%i in (' curl -s -H "Content-Type:application/json" -X POST -d "{\"username\":\"user\",\"password\":\"password\"}" https://hub.docker.com/v2/users/login ^|jq -r .token ') do set TOKEN=%%i
curl -sH "Authorization: JWT %TOKEN%" "https://hub.docker.com/v2/repositories/%1/tags/" | jq .results[].name
)
</pre>
</html>

因此,在此我们可以为批处理文件提供参数,例如:

Dockerfile Java版本7 


1

Docker Registry API有一个端点来列出所有标签

看起来Tutum具有类似的终结点,以及通过tutum-cli进行访问的方式。

使用tutum-cli,请尝试以下操作:

tutum tag list <uuid>

1
我认为这不适用于注册表映像。我只是得到“标识符'<id>'与任何服务,节点或节点群集都不匹配”。
约翰

1

在powershell 5.1中,我有一个简单的list_docker_image_tags.ps1脚本,如下所示:

[CmdletBinding()]
param (
    [Parameter(Mandatory = $true)]
    [string]
    $image
)

$url = "https://registry.hub.docker.com/v1/repositories/{0}/tags" -f $image 
Invoke-WebRequest $url  | ConvertFrom-Json | Write-Output

然后我可以grep 4.7这样的标签:

./list_docker_image_tags.ps1 microsoft/dotnet-framework | ?{ $_.name -match "4.7" }

1

您可以使用skopeo列出所有标签。

அ  ~  skopeo inspect docker://httpd |jq .RepoTags
[
  "2-alpine",
  "2.2-alpine",
  "2.2.29",
  "2.2.31-alpine",
  "2.2.31",
  "2.2.32-alpine",
  "2.2.32",
  "2.2.34-alpine",
  "2.2.34",
  "2.2",
  "2.4-alpine",
  "2.4.10",
  "2.4.12",
  "2.4.16",
  "2.4.17",
  "2.4.18",
  "2.4.20",
  "2.4.23-alpine",
  "2.4.23",
  "2.4.25-alpine",
  "2.4.25",
  "2.4.27-alpine",
  "2.4.27",
  "2.4.28-alpine",
  "2.4.28",
  "2.4.29-alpine",
  "2.4.29",
  "2.4.32-alpine",
  "2.4.32",
  "2.4.33-alpine",
  "2.4.33",
  "2.4.34-alpine",
  "2.4.34",
  "2.4.35-alpine",
  "2.4.35",
  "2.4.37-alpine",
  "2.4.37",
  "2.4.38-alpine",
  "2.4.38",
  "2.4.39-alpine",
  "2.4.39",
  "2.4.41-alpine",
  "2.4.41",
  "2.4.43-alpine",
  "2.4.43",
  "2.4",
  "2",
  "alpine",
  "latest"
]

对于外部注册表:

அ  ~  skopeo inspect --creds username:password docker://<registry-url>/<repo>/<image>

0

如果人们想从RedHat注册表中读取标签,https://registry.redhat.io/v2则步骤为:

# example nodejs-12 image
IMAGE_STREAM=nodejs-12
REDHAT_REGISTRY_API="https://registry.redhat.io/v2/rhel8/$IMAGE_STREAM"
# Get an oAuth token based on a service account username and password https://access.redhat.com/articles/3560571
TOKEN=$(curl --silent -u "$REGISTRY_USER":"$REGISTRY_PASSWORD" "https://sso.redhat.com/auth/realms/rhcc/protocol/redhat-docker-v2/auth?service=docker-registry&client_id=curl&scope=repository:rhel:pull" |  jq --raw-output '.token')
# Grab the tags
wget -q --header="Accept: application/json" --header="Authorization: Bearer $TOKEN" -O - "$REDHAT_REGISTRY_API/tags/list" | jq -r '."tags"[]' 

如果要比较本地openshift注册表中的内容与上游Registry.redhat.com中的内容,那么这里是一个完整的脚本

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.