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

kik*_*ell 191 docker docker-registry

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

{
  "num_results": 2,
  "query": "",
  "results": [
    {
      "description": "",
      "name": "deis/router"
    },
    {
      "description": "",
      "name": "deis/database"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

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

jon*_*tan 365

对于Registry V2的最新版本(截至2015-07-31),您可以从DockerHub 获取此图像:

docker pull distribution/registry:master
Run Code Online (Sandbox Code Playgroud)

列出所有存储库(有效图像):

curl -X GET https://myregistry:5000/v2/_catalog
> {"repositories":["redis","ubuntu"]}
Run Code Online (Sandbox Code Playgroud)

列出存储库的所有标记:

curl -X GET https://myregistry:5000/v2/ubuntu/tags/list
> {"name":"ubuntu","tags":["14.04"]}
Run Code Online (Sandbox Code Playgroud)

  • 默认结果只显示100个图像记录,但是如果需要显示更多,则可以使用此查询对结果进行分页:`http:// <registry-url>/v2/_catalog?n = <count>`带有例如2000的计数. (7认同)
  • 如果注册表受密码保护,请使用`curl -u &lt;user&gt;:&lt;pass&gt; -X GET ... (6认同)
  • -k,--insecure(SSL) (5认同)
  • @duality 如果您的注册表使用自签名证书或由不受信任的根 CA 签名的证书,您需要提供证书以 curl 建立安全连接。要建立不安全的连接,您可以添加“--insecure”标志。 (4认同)
  • 还要检查 docker-registry 在主机上使用的端口。它可能在内部映射到 5000,但在外部使用另一个映射。对我来说就是这样,因为它使用的是 443:5000,然后命令改为使用 443。 (3认同)
  • 您从哪里获得证书? (2认同)

小智 70

你可以搜索

http:// <ip/hostname>:<port>/ v2/_catalog

  • ...至于最近我只想添加https是必需的,而不仅仅是http (4认同)
  • 我认为最近安装的Docker Registry并不需要这样! (2认同)

lit*_*hua 38

获取目录

默认情况下,注册表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元素,则可以循环执行.

获取图片

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

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

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

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

收益:

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

  • 这应该是公认的答案。这是解释如何绕过可怕的分页的唯一答案。当前接受的答案 (jonatan) 仅显示以“a”开头的图像。 (3认同)

Zep*_*LUS 24

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

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


Cog*_*ves 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
Run Code Online (Sandbox Code Playgroud)

对某些人来说这可能是显而易见的,但我总是与键和证书混在一起.需要引用的文件是@jonaton上面提到的调用**,是上面列出的domain.crt.(因为我将domain.crt放入其中/root,我将副本复制到可以访问它的用户目录中.)

curl --cacert ~/domain.crt https://myregistry:5000/v2/_catalog
> {"repositories":["redis","ubuntu"]}
Run Code Online (Sandbox Code Playgroud)

**上面的命令已被更改:-X GET在我尝试时实际上没有工作.

注意:( https://myregistry:5000如上所述)必须与为生成的证书提供的域匹配.


小智 20

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


Ond*_*zka 10

安装注册表: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


Cha*_*Ang 8

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

如上所述,但在 URL 中提供用户名/密码。

curl -k -X GET https://yourusername:yourpassword@theregistryURL/v2/_catalog
Run Code Online (Sandbox Code Playgroud)

它作为未格式化的 JSON 返回。

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

curl -k -X GET https://yourusername:yourpassword@theregistryURL/v2/_catalog | python -m json.tool
Run Code Online (Sandbox Code Playgroud)


Jee*_*eef 7

Here is a nice little one liner (uses JQ) to print out a list of Repos and associated tags.

If you dont have jq installed you can use: 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
Run Code Online (Sandbox Code Playgroud)


ano*_*xis 6

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

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

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


Cra*_*ger 6

这是一个示例,它列出了注册表中所有图像的所有标签。它也处理为 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"][]'
Run Code Online (Sandbox Code Playgroud)

解释:

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


小智 6

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