如何获取 docker 注册表 v2 上的图像列表

Posted

技术标签:

【中文标题】如何获取 docker 注册表 v2 上的图像列表【英文标题】:How to get a list of images on docker registry v2 【发布时间】:2015-09-23 22:12:03 【问题描述】:

我正在使用 docker registry v1,我有兴趣迁移到更新的版本 v2。但是我需要一些方法来获取注册表中存在的图像列表;例如,使用注册表 v1,我可以向 http://myregistry:5000/v1/search? 执行 GET 请求,结果是:


  "num_results": 2,
  "query": "",
  "results": [
    
      "description": "",
      "name": "deis/router"
    ,
    
      "description": "",
      "name": "deis/database"
    
  ]

但我在 official documentation 上找不到类似的东西来获取注册表中的图像列表。有人知道在新版本 v2 上的方法吗?

【问题讨论】:

还是不够。需要图像创建和图像推送的日期,并希望包括/禁止以前的标签版本。也必须有一个实际的 Web 界面,对吧?我正在与我们的管理员交谈 - 我们只有 2.0 hub.docker.com 似乎有不同的 API,例如列出存储库的标签:curl -sSX GET 'https://hub.docker.com/v2/repositories/library/php/tags?page_size=100'。或者你可以使用docker-hub-api 【参考方案1】:

对于 Registry V2 的最新(截至 2015 年 7 月 31 日)版本,您可以从 DockerHub 获取this image:

docker pull distribution/registry:master

列出所有存储库(实际上是图像):

curl -X GET https://myregistry:5000/v2/_catalog
> "repositories":["redis","ubuntu"]

列出存储库的所有标签:

curl -X GET https://myregistry:5000/v2/ubuntu/tags/list
> "name":"ubuntu","tags":["14.04"]

如果注册表需要身份验证,您必须在curl 命令中指定用户名和密码

curl -X GET -u <user>:<pass> https://myregistry:5000/v2/_catalog
curl -X GET -u <user>:<pass> https://myregistry:5000/v2/ubuntu/tags/list

【讨论】:

从哪里获得证书? @duality 如果您的注册表使用自签名证书或由不受信任的根 CA 签名的证书,您需要将证书提供给 curl 以建立安全连接。要建立不安全的连接,您可以添加“--insecure”标志。 -k, --insecure (SSL) 默认结果只显示 100 条图像记录,但如果您需要显示更多,您可以使用此查询对结果进行分页:http://&lt;registry-url&gt;/v2/_catalog?n=&lt;count&gt; 计数例如 2000。 如果注册表受密码保护,请使用curl -u &lt;user&gt;:&lt;pass&gt; -X GET ...【参考方案2】:

你可以搜索

http://&lt;ip/hostname&gt;:&lt;port&gt;/v2/_catalog

【讨论】:

...最近我只想补充一点,需要 https 而不仅仅是 http 我认为我最近安装的 Docker Registry 没有这种需要!【参考方案3】:

获取目录

默认,registry api返回100个目录项,有code:

当你 curl 注册表 api 时:

curl --cacert domain.crt https://your.registry:5000/v2/_catalog

它相当于:

curl --cacert domain.crt https://your.registry:5000/v2/_catalog?n=100

这是一种分页方法。

当条目总和超过100时,可以通过两种方式进行:

首先:给出更大的数字

curl --cacert domain.crt https://your.registry:5000/v2/_catalog?n=2000

Sencond:解析下一个链接器url

curl --cacert domain.crt https://your.registry:5000/v2/_catalog

响应头中包含的链接元素:

curl --cacert domain.crt https://your.registry:5000/v2/_catalog

响应头:

Link: &lt;/v2/_catalog?last=pro-octopus-ws&amp;n=100&gt;; rel="next"

链接元素有本次请求的最后一个条目,然后你可以请求下一个“页面”:

curl --cacert domain.crt https://your.registry:5000/v2/_catalog?last=pro-octopus-ws

如果响应头包含 link 元素,您可以在 循环 中进行。

获取图片

当你得到目录的结果时,如下所示:

"repositories": [ "busybox", "ceph/mds" ]

您可以获取每个目录中的图片:

curl --cacert domain.crt https://your.registry:5000/v2/busybox/tags/list

返回:

"name":"busybox","tags":["latest"]

【讨论】:

定义了 100 个条目 here 这应该是公认的答案。这是解释如何绕过可怕的分页的唯一答案。当前接受的答案 (jonatan) 仅显示以“a”开头的图像。 你将如何获得ceph/mds 的标签列表?一般来说,对于使用/ - /v2/_catalog/ceph/mdt/tags/list 定义的任何存储库都不起作用 @tymik 我们可以通过使用/v2/ceph/mdt/tags/list 即省略_catalog 来访问名称中包含/ 的存储库的标签列表(也适用于没有/ 的存储库)参考:@987654323 @【参考方案4】:

https://github.com/docker/distribution 提供的最新版 Docker Registry 支持 Catalog API。 (v2/_catalog)。这允许搜索存储库的能力

如果有兴趣,您可以尝试我构建的 docker image registry CLI,以便在新的 Docker Registry 发行版中轻松使用 搜索功能 (https://github.com/vivekjuneja/docker_registry_cli)

【讨论】:

【参考方案5】:

为此我们编写了一个 CLI 工具:docker-ls 它允许您浏览 docker 注册表并支持通过令牌或基本身份验证进行身份验证。

【讨论】:

【参考方案6】:

这一直让我发疯,但我终于把所有的部分放在一起。截至 2015 年 1 月 25 日,我已经确认可以在 docker V2 注册表中列出图像(正如上面提到的@jonatan。)

如果我有代表,我会投票赞成这个答案。

相反,我将扩展答案。由于注册表 V2 是在考虑安全性的情况下制作的,因此我认为包含set it up with a self signed cert 和run the container with that cert 的方法是合适的,以便可以使用该证书对其进行 https 调用:

这是我实际用来启动注册表的脚本:

sudo docker stop registry
sudo docker rm -v registry
sudo docker run -d \
  -p 5001:5001 \
  -p 5000:5000 \
  --restart=always \
  --name registry \
  -v /data/registry:/var/lib/registry \
  -v /root/certs:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \ 
  -e REGISTRY_HTTP_DEBUG_ADDR=':5001' \
  registry:2.2.1

这对某些人来说可能很明显,但我总是对密钥和证书感到困惑。上面提到的@jonaton 调用需要引用的文件是上面列出的 domain.crt。 (由于我将 domain.crt 放在/root 中,因此我将其复制到可以访问的用户目录中。)

curl --cacert ~/domain.crt https://myregistry:5000/v2/_catalog
> "repositories":["redis","ubuntu"]

**上面的命令已经改了:-X GET 在我尝试的时候并没有实际工作。

注意:https://myregistry:5000(如上)必须与生成证书的域匹配。

【讨论】:

【参考方案7】:

安装 registry:2.1.1 或更高版本(可以查看最后一个,here)并使用 GET /v2/_catalog 获取列表。

https://github.com/docker/distribution/blob/master/docs/spec/api.md#listing-repositories

通过 Shell 脚本示例列出所有图像: https://gist.github.com/OndrejP/a2386d08e5308b0776c0

【讨论】:

【参考方案8】:

这是一个不错的小班轮(使用 JQ)打印出 Repos 和相关标签的列表。

如果您没有安装jq,您可以使用:brew install jq

# This is my URL but you can use any
REPO_URL=10.230.47.94:443

curl -k -s -X GET https://$REPO_URL/v2/_catalog \
 | jq '.repositories[]' \
 | sort \
 | xargs -I _ curl -s -k -X GET https://$REPO_URL/v2/_/tags/list

【讨论】:

啊,我刚写了这个然后找到了你的 :S 但我会保留我的答案,因为它也显示了如何处理基本身份验证,并解释了它的工作原理。还将结果过滤到平面图像列表中。 以防万一 jq 不在您的 Linux 发行版中,请给她stedolan.github.io/jq/download 这是一个非常有用的小工具。【参考方案9】:

除了我必须提供登录详细信息,因为它是本地 docker 存储库,我必须在这里做同样的事情并且上述工作。

与上述相同,但在 URL 中提供用户名/密码。

curl -k -X GET https://yourusername:yourpassword@theregistryURL/v2/_catalog

它以未格式化的 JSON 形式返回。

为了便于人类阅读,我通过 python 格式化程序对其进行了管道传输,以防您希望使用这种格式。

curl -k -X GET https://yourusername:yourpassword@theregistryURL/v2/_catalog | python -m json.tool

【讨论】:

【参考方案10】:

这是一个示例,它列出了注册表中所有图像的所有标签。它也处理为 HTTP 基本身份验证配置的注册表。

THE_REGISTRY=localhost:5000

# Get username:password from docker configuration. You could
# inject these some other way instead if you wanted.
CREDS=$(jq -r ".[\"auths\"][\"$THE_REGISTRY\"][\"auth\"]" .docker/config.json | base64 -d)

curl -s --user $CREDS https://$THE_REGISTRY/v2/_catalog | \
    jq -r '.["repositories"][]' | \
    xargs -I @REPO@ curl -s --user $CREDS https://$THE_REGISTRY/v2/@REPO@/tags/list | \
    jq -M '.["name"] + ":" + .["tags"][]'

解释:

从 .docker/config.json 中提取用户名:密码 向注册表发出 https 请求以列出所有“存储库” 将 json 结果过滤为存储库名称的平面列表 对于每个存储库名称: 向注册表发出 https 请求以列出该“存储库”的所有“标签” 过滤结果 json 对象流,为每个存储库中找到的每个标签打印 "repository":"tag" 对

【讨论】:

不错。简单使用 API 和普通的旧 shell 级工具。【参考方案11】:

使用“/v2/_catalog”和“/tags/list”端点无法真正列出所有图像。如果您推送了一些不同的图像并将它们标记为“最新”,那么您就无法真正列出旧图像!如果您使用摘要“docker pull ubuntu@sha256:ac13c5d2 ...”引用它们,您仍然可以提取它们。所以答案是——没有办法列出图片你只能列出不一样的标签

【讨论】:

【参考方案12】:

我写了一个easy-to-use command line tool 用于以各种方式列出图像(例如列出所有图像、列出这些图像的所有标签、列出这些标签的所有层)。

它还允许您以各种方式删除未使用的图像,例如仅删除单个图像或所有图像的旧标签等。当您从 CI 服务器填充注册表并希望仅保留最新/稳定版本。

它是用python编写的,不需要你下载庞大的自定义注册表图像。

【讨论】:

【参考方案13】:

如果有人能走到这一步。

采取其他人已经说过的话。这是一个将答案放入格式为 json 的文本文件中的单行器。

curl "http://mydocker.registry.domain/v2/_catalog?n=2000" | jq . - > /tmp/registry.lst

这看起来像


  "repositories": [
    "somerepo/somecontiner",
    "somerepo_other/someothercontiner",
 ...
  ]

您可能需要更改 `?n=xxxx' 以匹配您拥有的容器数量。

Next 是一种自动删除旧的和未使用的容器的方法。

【讨论】:

【参考方案14】:

这个话题可以追溯到很久以前,应该考虑的最新工具是skopeocrane

skopeo 支持签名并具有许多其他功能,而crane 更简约一些,我发现它更容易集成到一个简单的 shell 脚本中。

【讨论】:

这些都是很棒的工具,特别是如果您有特殊的身份验证要求(例如 ActiveDirectory)。【参考方案15】:

在撰写本文时,目前不支持 Docker 搜索注册表 v2 功能。请参阅自 2015 年 2 月以来的讨论:“提出注册表搜索功能 #206”https://github.com/docker/distribution/issues/206

我写了一个脚本,view-private-registry,你可以找到它:https://github.com/BradleyA/Search-docker-registry-v2-script.1.0 它并不漂亮,但它从私有注册表中获取所需的信息。

view-private-registry 的输出示例:

$ view-private-registry`
busybox:latest
gcr.io/google_containers/etcd:2.0.9
gcr.io/google_containers/hyperkube:v0.21.2
gcr.io/google_containers/pause:0.8.0
google/cadvisor:latest
jenkins:latest
logstash:latest
mongo:latest
nginx:latest
python:2.7
redis:latest
registry:2.1.1
stackengine/controller:latest
tomcat:7
tomcat:latest
ubuntu:14.04.2
Number of images:   16
Disk space used:    1.7G    /mnt/three/docker-registry/registry-data

【讨论】:

【参考方案16】:

由于每个注册表都作为容器运行,因此容器 ID 具有关联的日志文件 ID-json.log,此日志文件包含 vars.name=[image] 和 vars.reference=[tag]。脚本可用于推断和打印这些。这可能是列出推送到注册表 V2-2.0.1 的图像的一种方法。

【讨论】:

【参考方案17】:

如果您的用例仅识别 SIGNEDTRUSTED 图像用于生产,那么此方法很方便。

它为所有 SIGNED 标签解析一个 docker image repo,并去除所有 JSON 格式,只吐出干净的图像标签。当然可以根据您的要求进一步处理。

命令格式:

docker trust inspect imageName | grep "SignedTag" | awk -F'"' 'print $4'

使用 nginx 和 Bitnami Docker 存储库的示例:

docker trust inspect nginx | grep "SignedTag" | awk -F'"' 'print $4'

docker trust inspect bitnami/java | grep "SignedTag" | awk -F'"' 'print $4'

如果没有签名的图像,则 没有签名或无法访问 imageName 将被返回。

使用 Wordpress Docker 存储库的存储库示例没有签名图像(在撰写本文时):

docker trust inspect wordpress | grep "SignedTag" | awk -F'"' 'print $4'

【讨论】:

以上是关于如何获取 docker 注册表 v2 上的图像列表的主要内容,如果未能解决你的问题,请参考以下文章

如何在Docker命令行上的Docker注册表中找到具有特定标记的Docker镜像?

如何使用 Apache 和 CA 证书配置 Docker Registry V2?

在 nginx 代理后面使用 docker 私有注册表 (v2) 的 HTTP 响应格式错误

如何在 docker 中从私有 1.0 注册表中搜索图像? [关闭]

如何使用 CLI/SDK 获取 Fargate 任务的 docker 镜像 ID?

如何使用 CI/CD 为 Gitlab 注册表推送基于 docker compose 的图像