如何使用CLI(首选)或curl在远程Docker注册表上列出Docker映像的所有标签?
最好不要从远程注册表中提取所有版本。我只想列出标签。
docker(1) github.com/docker/for-linux/issues/455
如何使用CLI(首选)或curl在远程Docker注册表上列出Docker映像的所有标签?
最好不要从远程注册表中提取所有版本。我只想列出标签。
docker(1) github.com/docker/for-linux/issues/455
Answers:
我从这里得到了答案。非常感谢!:)
只需一行脚本:(找到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标签
...[backtick]中,以将其压缩为一行。和/或用$ 1替换“ debian”,并将其放在/ usr / local / bin下的脚本“ dockertags”中。然后,在结束反引号之前,您可以添加| grep $ 2。然后chmod + x它,然后您可以转到“ dockertags php apache”以查看所有包含apache的php标签。
wget -q https://registry.hub.docker.com/v1/repositories/circleci/ruby/tags -O - | jq -r '.[].name'如果您已jq安装
sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g'的文字写得更加清晰tr -d '[]" '
userauth="-u ${2}"允许${userauth}(如果它为空,则不切换或设置参数)。这可能会帮助使用私人回购协议的任何人
如果要使用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"]'
https://registry.hub.docker.com/v2/repositories/library/centos/tags/?page=101正常工作?
java图像是一个很好的例子。是的,您可以执行诸如Registry.hub.docker.com/v2/repositories/library/java/tags/…之类的操作。有关示例,请参见结果中的next和previous链接。
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参数。
arr=("$@")。只需写docker-tags() { for item; do ....
我设法使用curl使其工作:
curl -u <username>:<password> https://tutum.co/v1/repositories/<username>/<image_name>/tags
请注意,image_name不应包含用户信息等。例如,如果你推命名的图像tutum.co/username/x,然后image_name应该是x。
基于Yan Foto的答案(v2 API),我创建了一个简单的Python脚本来列出给定图像的标签。
用法:
./docker-registry-list.py alpine
输出:
{
"name": "library/alpine",
"tags": [
"2.6",
"2.7",
"3.1",
"3.2",
"3.3",
"3.4",
"3.5",
"3.6",
"3.7",
"edge",
"latest"
]
}
如果有JSON解析工具,jq则可用
wget -q https://registry.hub.docker.com/v1/repositories/debian/tags -O - | \
jq -r '.[].name'
'.[].name'
no matches found: .[].name。但这在bash上效果很好,也许这是您的默认shell?
jq命令中添加了引号
请参阅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
要在浏览器中查看所有可用标签:
https://registry.hub.docker.com/v1/repositories/<username>/<image_name>/tags
即https://hub.docker.com/r/localstack/localstack/tags
或者,您可以使用以下端点获取json响应:
https://registry.hub.docker.com/v1/repositories/localstack/localstack/tags
您还可以使用以下废料:
# 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
[希望您在运行任何命令之前了解$&# ]
从Docker Hub获取所有标签:此命令使用命令行JSON处理器jq从JSONDocker Hub注册表返回的标签中选择标签名称(引号用除去tr)。将库替换为Docker Hub用户名,将debian替换为镜像名:
curl -s 'https://registry.hub.docker.com/v2/repositories/library/debian/tags/' | jq -r '."results"[]["name"]'
这是我为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
}
您可以通过在终端上运行以下命令来实现:
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命令
curl -L -s 'https://registry.hub.docker.com/v1/repositories/danilobatistaqueiroz/job-wq-1/tags'
当我必须执行一项任务时,如果用户以某种方式键入了错误的标签,那么我们就必须提供该寄存器中存在的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
在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" }
您可以使用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>
如果人们想从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中的内容,那么这里是一个完整的脚本。