我正在使用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上做到这一点的方法吗?
答案 0 :(得分:319)
对于Registry V2的最新版本(截至2015-07-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"]}
答案 1 :(得分:59)
你可以搜索
的http://
<ip/hostname>
:<port>
/ V2 / _catalog
答案 2 :(得分:32)
默认情况下,注册表api返回100个目录条目,有code:
当你卷曲注册表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 :解析下一个链接器网址
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"]}
答案 3 :(得分:23)
https://github.com/docker/distribution提供的最新版本的Docker Registry支持Catalog API。 (V2 / _catalog)。这允许搜索存储库的功能
如果有兴趣,您可以尝试我构建的docker image注册表CLI,以便在新的Docker Registry分发版中使用搜索功能(https://github.com/vivekjuneja/docker_registry_cli)
答案 4 :(得分:19)
这让我发疯,但我终于把所有的东西放在了一起。截至2015年1月25日,我已经确认可以在docker V2注册表中列出图像(与上面提到的@jonatan完全相同。)
如果我有代表,那我就会对这个答案进行投票。
相反,我会扩展答案。由于注册表V2是在考虑安全性的情况下制定的,因此我认为包含如何set it up with a self signed cert和run the container with that cert以便可以使用该证书对其进行https调用是合适的:< / p>
这是我实际用于启动注册表的脚本:
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
(如上所述)必须与为生成的证书提供的域匹配。
答案 5 :(得分:14)
请参阅@ jonathan的回答below或此处的注册表API文档:https://docs.docker.com/registry/spec/api/
如果您搜索&#34;列出&#34;您会看到版本e
中添加了支持。
答案 6 :(得分:12)
我们为此目的编写了一个CLI工具:docker-ls它允许您浏览docker注册表并通过令牌或基本身份验证支持身份验证。
答案 7 :(得分:9)
安装注册表: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 :(得分:5)
这是一个很好的小衬板(使用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
答案 9 :(得分:2)
答案 10 :(得分:2)
使用“ / v2 / _catalog”和“ / tags / list”端点不能真正列出所有图像。如果您推送了一些不同的图像并将它们标记为“最新”,则您实际上无法列出旧图像!如果使用摘要“ docker pull ubuntu @ sha256:ac13c5d2 ...”来引用它们,则仍可以拉出它们。所以答案是-无法列出图像,您只能列出不相同的标签
答案 11 :(得分:2)
在这里和上面的工作我必须做同样的事情,除了我必须提供登录详细信息,因为它是本地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
答案 12 :(得分:2)
如果有的话要走的远。
接受上面其他人已经说过的话。这是将答案放入格式为json的文本文件中的一线工具。
curl "http://mydocker.registry.domain/v2/_catalog?n=2000" | jq . - > /tmp/registry.lst
看起来像
{
"repositories": [
"somerepo/somecontiner",
"somerepo_other/someothercontiner",
...
]
}
您可能需要更改“?n = xxxx”以匹配您拥有的容器数量。
下一步是一种自动删除旧的和未使用的容器的方法。
答案 13 :(得分:1)
我写了easy-to-use command line tool以各种方式列出图片(比如列出所有图片,列出这些图片的所有标签,列出这些标签的所有图层)。
它还允许您以各种方式删除未使用的图像,例如仅删除单个图像的旧标签或所有图像等。当您从CI服务器填充注册表并且只想保留最新/时,这很方便稳定的版本。
它是用python编写的,不需要你下载庞大的大型自定义注册表图像。
答案 14 :(得分:1)
撰写本文时,目前不支持Docker搜索注册表v2功能。请参阅2015年2月以来的讨论:“提出注册表搜索功能#206”https://github.com/docker/distribution/issues/206
我写了一个你可以找到的脚本:https://github.com/BradleyA/Search-docker-registry-v2-script.1.0 它并不漂亮,但它从私人注册表中获取所需的信息。
答案 15 :(得分:0)
这里是一个示例,列出了注册表中所有图像的所有标记。它也处理为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 @REPO@ curl -s --user $CREDS https://$THE_REGISTRY/v2/@REPO@/tags/list | \
jq -M '.["name"] + ":" + .["tags"][]'
说明:
答案 16 :(得分:0)
由于每个注册表作为容器运行,因此容器ID具有关联的日志文件ID-json.log,此日志文件包含vars.name = [image]和vars.reference = [tag]。脚本可用于外推和打印这些脚本。这可能是列出推送到注册表V2-2.0.1的图像的一种方法。