it-swarm.dev

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

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

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

但我找不到 官方文档 类似的东西获得注册表上的图像列表。有人知道在新版本v2上做到这一点的方法吗?

167
kikicarbonell

对于Registry V2的最新版本(截至2015-07-31),您可以从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"]}
314
jonatan

你可以搜索

hTTP:// <ip/hostname><port>/V2/_catalog

59
Abhishek Jaiswal

获取目录

默认情况下,注册表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

响应头中包含的link元素:

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 element,则可以在 loop 中执行。

获取图片

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

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

你可以在每个目录中获取图像:

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

收益:

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

32
litanhua

最新版本的Docker Registry可从 https://github.com/docker/distribution 支持Catalog API获得。 (V2/_catalog)。这允许搜索存储库的功能

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

23
ZephyrPLUSPLUS

这让我疯狂,但我终于把所有的东西放在一起了。截至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(如上所述)必须与为生成的证书提供的域匹配。

19
Cognitiaclaeves

请参阅@ jonathan的答案 下面 ,或者注册表API文档: https://docs.docker.com/registry/spec/api/

如果您搜索“列表”,您会看到在版本e中添加了支持。

14
Andy

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

12
Christian Speckner

安装注册表:2.1.1或更高版本(您可以检查最后一个, 这里 )并使用GET/v2/_catalog获取列表。

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

列表所有图像由Shell脚本示例: https://Gist.github.com/OndrejP/a2386d08e5308b0776c0

9
Ondrej Prochazka

这是一个Nice little one liner(使用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
5
Jeef

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

它是按照上述方式但在URL中提供用户名/密码。

curl -k -X GET https://yourusername:[email protected]/v2/_catalog

它以无格式JSON的形式返回。

我通过python格式化程序将它传输到易于人类阅读的地方,以防你希望以这种格式使用它。

curl -k -X GET https://yourusername:[email protected]/v2/_catalog | python -m json.tool
2
chai

如果有人就这么做了。

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

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

这看起来像

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

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

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

2
nelaaro

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

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

1
Bradley Allen

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

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

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

1
anoxis

这是一个列出注册表中所有图像的所有标记的示例。它还处理为HTTP Basic身份验证配置的注册表。

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 @[email protected] curl -s --user $CREDS https://$THE_REGISTRY/v2/@[email protected]/tags/list | \
    jq -M '.["name"] + ":" + .["tags"][]'

说明:

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

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

0
Phil Pinkerton