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

Joh*_*han 177 docker

我想知道如何使用CLI(首选)或curl 列出远程Docker注册表(我们案例中的tutum,但我认为不重要)的Docker镜像的所有标签?最好不要从远程注册表中提取所有版本,我只想列出标签.

小智 152

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

只需一行脚本:(查找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}'
Run Code Online (Sandbox Code Playgroud)

更新感谢@ 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}"
Run Code Online (Sandbox Code Playgroud)

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

用法:

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

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

  • `wget -q https://registry.hub.docker.com/v1/repositories/circleci/ruby/tags -O - | jq -r'.[].name'`如果你安装了`jq` (6认同)
  • 我修改为使用第二个位置参数作为用户名:密码,以便我可以将 wget 切换为 curl 并使用 `userauth="-u ${2}"` 允许我使用 `${userauth}`(如果它是空白的没有你切换或参数)。这可能会帮助任何使用私人回购的人 (2认同)

Yan*_*oto 75

从Docker Registry V2开始,GET就足够了:

GET /v2/<name>/tags/list
Run Code Online (Sandbox Code Playgroud)

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

  • 基于[文档中的标签子部分](https://docs.docker.com/registry/spec/api/#tags)中的信息,此GET似乎需要授权,因此出现v1 API +`sed`实际上更容易用于快速检查...... (2认同)
  • 如果收到“未经授权”错误,请[参见我的替代答案](/sf/answers/3634530861/)。发布原始答案的人没有冒犯。我不得不采取其他措施才能获得上述答案,并希望为他人提供帮助。 (2认同)

Joh*_*han 17

我已经设法使用curl工作了:

curl -u <username>:<password> https://tutum.co/v1/repositories/<username>/<image_name>/tags
Run Code Online (Sandbox Code Playgroud)

请注意,image_name不应包含用户详细信息等.例如,如果您正在推送已命名的图像,tutum.co/username/x那么image_name应该是x.

  • v2 端点记录在此处:https://docs.docker.com/registry/spec/api/#listing-image-tags (2认同)

0xC*_*xCC 17

如果要使用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"]'
Run Code Online (Sandbox Code Playgroud)

  • Docker Hub似乎将page_size限制为有效最大值100。 (2认同)
  • @Shane哦真的吗?我没有遇到过那么多页面的图像.像https://registry.hub.docker.com/v2/repositories/library/centos/tags/?page = 101`这样的网址是否有效? (2认同)
  • `java`图像就是一个很好的例子.是的,您可以执行https://registry.hub.docker.com/v2/repositories/library/java/tags/?page_size=100&page=2之类的操作.有关示例,请参阅结果中的`next`和`previous`链接. (2认同)

sig*_*ice 16

如果JSON解析工具jq可用

wget -q https://registry.hub.docker.com/v1/repositories/debian/tags -O - | \
    jq -r '.[].name'
Run Code Online (Sandbox Code Playgroud)


sch*_*rer 13

截至 2023 年,有许多工具可以做到这一点

docker run --rm ghcr.io/regclient/regctl:v0.4.5 tag ls ghcr.io/regclient/regctl      

docker run --rm quay.io/skopeo/stable:v1.9.2 list-tags docker://quay.io/skopeo/stable \
  | jq -r '.Tags[]'

docker run --rm gcr.io/go-containerregistry/crane ls gcr.io/go-containerregistry/crane  

docker run --rm r.j3ss.co/reg:v0.16.1 tags r.j3ss.co/reg
Run Code Online (Sandbox Code Playgroud)

顺便说一句 - 还有更多的工具。这个列表看起来很全面:
iximiuz/awesome-container-tinkering


Rob*_*V8R 11

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
}
Run Code Online (Sandbox Code Playgroud)

docker-tags "microsoft/nanoserver" "microsoft/dotnet" "library/mongo" "library/redis"
Run Code Online (Sandbox Code Playgroud)

不可否认,docker-tags做出了几个假设.具体而言,OAuth请求参数大多是硬编码的.更雄心勃勃的实现将向注册表提出未经身份验证的请求,并从未经身份验证的响应中获取OAuth参数.

  • 不需要`arr=("$@")`。只需编写`docker-tags() { for item; 做....` (3认同)
  • @JakeRobb https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_04_03 (2认同)

Buv*_*mar 11

您可以通过 cli列出带有skopeojq用于 json 解析的所有标签。

skopeo --override-os linux inspect docker://httpd | jq '.RepoTags'
Run Code Online (Sandbox Code Playgroud)
skopeo --override-os linux inspect docker://httpd | jq '.RepoTags'
Run Code Online (Sandbox Code Playgroud)

对于外部注册表:

[
  "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"
]
Run Code Online (Sandbox Code Playgroud)

注意:--override-os linux仅当您不在 linux 主机上运行时才需要。例如,如果您在 MacOS 上使用它,您将获得更好的结果。

  • 我看到 skopeo 还有一个“list-tags”命令。与 `jq --raw-output` 一起,您可以获得一个简单的标签列表:`skopeo --override-os linux list-tags docker://httpd | jq --raw-output .Tags[]`。 (4认同)

Aki*_*ing 11

podman

Podman 是 docker 的直接替代品,具有更多功能,主要区别在于它不需要守护进程并且不以 root 身份运行。如果您正在使用podman,则可以使用podman search

# podman search --list-tags <image name> --limit 1000
podman search --list-tags docker.io/alpine --limit 1000
Run Code Online (Sandbox Code Playgroud)

有一个docker命令,但我找不到该list-tags选项。


Ale*_*tis 6

请参阅 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


Ale*_*bes 5

在Yan Foto的答案(v2 API)的基础上,我创建了一个简单的Python脚本来列出给定图像的标签

用法:

./docker-registry-list.py alpine
Run Code Online (Sandbox Code Playgroud)

输出:

{
  "name": "library/alpine",
  "tags": [
    "2.6",
    "2.7",
    "3.1",
    "3.2",
    "3.3",
    "3.4",
    "3.5",
    "3.6",
    "3.7",
    "edge",
    "latest"
  ]
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*e W 5

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

获取 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
}
Run Code Online (Sandbox Code Playgroud)


elo*_*ezp 5

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

curl -L -s 'https://registry.hub.docker.com/v2/repositories/library/mysql/tags/' | jq . | grep name
Run Code Online (Sandbox Code Playgroud)

另外,如果您没有 jq,则必须通过以下方式安装它

sudo apt-get install jq
Run Code Online (Sandbox Code Playgroud)

  • `curl -L -s 'https://registry.hub.docker.com/v2/repositories/library/mysql/tags/' | jq .results[].name ` 将为您节省 grep 命令 (4认同)