如何在docker注册表v2上获得图像列表

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

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

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

714326 次浏览

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

如果感兴趣,你可以尝试我构建的docker镜像注册表CLI,以便在新的docker注册表发行版(https://github.com/vivekjuneja/docker_registry_cli)中轻松使用搜索功能

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

如果注册表需要身份验证,则必须在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

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

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

This has been driving me crazy, but I finally put all the pieces together. 截至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调用**需要引用的文件就是域。上面列出的CRT。(因为我把域。在/root,我做了一个拷贝到用户目录,在那里它可以访问。)

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

**上面的命令已经更改:-X GET实际上没有工作,当我尝试它。

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

在撰写本文时,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

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

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

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

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

你可以搜索

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

获取目录

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

第二个:解析下一个链接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

如果响应头包含链接元素,则可以在循环中执行。

得到图像

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

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

您可以在每个目录中获得图像:

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

返回:

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

如果有人能走到这一步。

借鉴上面别人已经说过的话。下面是一个一行程序,它将答案放入一个json格式的文本文件中。

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

这看起来像

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

你可能需要改变' ?N =xxxx'来匹配容器的数量。

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

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

下面是一个漂亮的小程序(使用JQ),用于打印repo和相关标记的列表。

如果你没有安装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

下面的例子列出了注册表中所有图像的所有标签。它还处理为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”对

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

这个线程可以追溯到很久以前,最近应该考虑的工具是skopeocrane

skopeo支持签名并有许多其他特性,而crane更简洁一些,我发现它更容易集成在一个简单的shell脚本中。

如果您的用例仅标识用于生产的签署受信任的图像,则此方法非常方便。

它为所有签署标记解析docker图像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}'

如果你想为你的注册表提供一个漂亮的web界面,你可以使用注册表浏览器docker image。如果你只是想查看一下你的注册表、不同的存储库和标签,这是很有用的。

enter image description here

一行bash列出所有图片及其标签:

curl --user user:pass https://myregistry.com/v2/_catalog | jq .repositories | sed -n 's/[ ",]//gp' | xargs -L1 -IIMAGE curl -s --user user:pass https://myregistry.com/v2/IMAGE/tags/list | jq '. as $parent | .tags[] | $parent.name + ":" + . '

用两行来搜索图像名称中的内容:

search=my_container_part_name
curl --user user:pass https://registry.medworx.io/v2/_catalog | jq .repositories | sed -n '/'"$search"'/{s/[ ",]//gp;}' | xargs -L1 -IIMAGE curl -s --user user:pass https://registry.medworx.io/v2/IMAGE/tags/list | jq '. as $parent | .tags[] | $parent.name + ":" + . '

替换:user, pass和myregistry.com

使用curl, sed, xargs和jq,很难理解…但它确实起作用了。它对每个图像+ 1产生一次调用。

如果你可以ssh或附加到docker注册表容器,只需要浏览文件系统来查找你想要的东西,比如:

kubectl exec -it docker-registry-0 -- /bin/sh


ls /var/lib/registry/docker/registry/v2/repositories
ls /var/lib/registry/docker/registry/v2/repositories/busybox/_manifests/tags/