如何在Docker注册表v2上获取图像列表


203

我正在使用docker Registry v1,并且有兴趣迁移到较新的版本v2。但是我需要某种方法来获取注册表中存在的图像列表。例如,对于注册表v1,我可以执行GET请求,http://myregistry:5000/v1/search?结果是:

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

但是我在官方文档中找不到类似于在注册表中获取映像列表的内容。有人知道在新版本v2上执行此操作的方法吗?


还不够。需要图像创建和图像推送的日期,并希望包括/禁止以前的标记版本。也必须有一个实际的Web界面,对不对?我正在和我们的管理员聊天-我们只有2.0
Andrew Wolfe

Answers:


404

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

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"]}

3
您从哪里获得证书?
duality_

3
@duality,如果您的注册表使用的是自签名证书或由不受信任的根CA签名的证书,则需要提供证书以进行卷曲以建立安全连接。要建立不安全的连接,可以添加“ --insecure”标志。
jonatan

5
-k,--insecure(SSL)
Ilja

9
默认结果仅显示100张图像记录,但是如果您需要显示更多图像,则可以使用以下查询对结果进行分页:http://<registry-url>/v2/_catalog?n=<count>例如,计数为
2000。– kikicarbonell

17
如果注册表受密码保护,请使用curl -u <user>:<pass> -X GET ...
nsantos


42

获取目录

默认情况下,注册表api返回目录的100个条目,代码如下:

当您卷曲注册表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: </v2/_catalog?last=pro-octopus-ws&n=100>; rel="next"

link元素具有此请求的最后一个条目,然后您可以请求下一个“页面”:

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"]}



2
这应该是公认的答案。这是唯一说明您如何避免可怕的分页的答案。当前接受的答案(jonatan)仅显示以“ a”开头的图像。
user2394284 '18 -10-15

以及如何获取标签列表ceph/mds?通常,对于使用/- 定义的任何存储库- /v2/_catalog/ceph/mdt/tags/list不起作用
tymik



21

这让我发疯,但我终于把所有的东西放在一起。从2015年1月25日开始,我已经确认可以在Docker V2注册表中列出图像(与上面提到的@jonatan完全相同)。

如果我有代表,我会投票赞成。

相反,我将扩展答案。由于注册表V2的设计考虑到安全性,因此我认为应该包括如何使用自签名证书进行设置,并使用该证书运行容器,以便可以使用该证书对其进行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

这是一个很好的小衬板(使用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 这是一个非常有用的小工具。
ISQ

5

我必须在这里和上面的工作中做同样的事情,除了我必须提供登录详细信息,因为它是本地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

4

使用“ / v2 / _catalog”和“ / tags / list”端点不能真正列出所有图像。如果您推送了一些不同的图像并将它们标记为“最新”,则您实际上无法列出旧图像!如果使用摘要“ docker pull ubuntu @ sha256:ac13c5d2 ...”来引用它们,您仍然可以拉出它们。因此,答案是-无法列出图像,您只能列出不相同的标签


3

如果有的话走的很远。

接受别人在上面已经说过的话。这是将答案放入格式为json的文本文件中的一线工具。

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

看起来像

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

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

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



2

我写了一个易于使用的命令行工具用于以各种方式列出图像(例如列出所有图像,列出这些图像的所有标签,列出这些标签的所有层)。

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

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


2

这是一个示例,列出了注册表中所有图像的所有标签。它也处理为HTTP Basic auth配置的注册表。

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”对

1

该线程可以追溯很久,一个人应该考虑的最新工具是skopeoand crane

skopeo支持签名并具有许多其他功能,而crane有些简化,我发现可以更轻松地与简单的shell脚本集成。


0

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

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.