如何获取 docker 注册表 v2 上的图像列表
Posted
技术标签:
【中文标题】如何获取 docker 注册表 v2 上的图像列表【英文标题】:How to get a list of images on docker registry v2 【发布时间】:2015-09-23 22:12:03 【问题描述】:我正在使用 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 上的方法吗?
【问题讨论】:
还是不够。需要图像创建和图像推送的日期,并希望包括/禁止以前的标签版本。也必须有一个实际的 Web 界面,对吧?我正在与我们的管理员交谈 - 我们只有 2.0 hub.docker.com 似乎有不同的 API,例如列出存储库的标签:curl -sSX GET 'https://hub.docker.com/v2/repositories/library/php/tags?page_size=100'
。或者你可以使用docker-hub-api
。
【参考方案1】:
对于 Registry V2 的最新(截至 2015 年 7 月 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"]
如果注册表需要身份验证,您必须在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
【讨论】:
从哪里获得证书? @duality 如果您的注册表使用自签名证书或由不受信任的根 CA 签名的证书,您需要将证书提供给 curl 以建立安全连接。要建立不安全的连接,您可以添加“--insecure”标志。 -k, --insecure (SSL) 默认结果只显示 100 条图像记录,但如果您需要显示更多,您可以使用此查询对结果进行分页:http://<registry-url>/v2/_catalog?n=<count>
计数例如 2000。
如果注册表受密码保护,请使用curl -u <user>:<pass> -X GET ...
【参考方案2】:
你可以搜索
http://
<ip/hostname>
:<port>
/v2/_catalog
【讨论】:
...最近我只想补充一点,需要 https 而不仅仅是 http 我认为我最近安装的 Docker Registry 没有这种需要!【参考方案3】:获取目录
默认,registry api返回100个目录项,有code:
当你 curl 注册表 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"
链接元素有本次请求的最后一个条目,然后你可以请求下一个“页面”:
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"]
【讨论】:
定义了 100 个条目 here 这应该是公认的答案。这是解释如何绕过可怕的分页的唯一答案。当前接受的答案 (jonatan) 仅显示以“a”开头的图像。 你将如何获得ceph/mds
的标签列表?一般来说,对于使用/
- /v2/_catalog/ceph/mdt/tags/list
定义的任何存储库都不起作用
@tymik 我们可以通过使用/v2/ceph/mdt/tags/list
即省略_catalog
来访问名称中包含/
的存储库的标签列表(也适用于没有/
的存储库)参考:@987654323 @【参考方案4】:
https://github.com/docker/distribution 提供的最新版 Docker Registry 支持 Catalog API。 (v2/_catalog)。这允许搜索存储库的能力
如果有兴趣,您可以尝试我构建的 docker image registry CLI,以便在新的 Docker Registry 发行版中轻松使用 搜索功能 (https://github.com/vivekjuneja/docker_registry_cli)
【讨论】:
【参考方案5】:为此我们编写了一个 CLI 工具:docker-ls 它允许您浏览 docker 注册表并支持通过令牌或基本身份验证进行身份验证。
【讨论】:
【参考方案6】:这一直让我发疯,但我终于把所有的部分放在一起。截至 2015 年 1 月 25 日,我已经确认可以在 docker V2 注册表中列出图像(正如上面提到的@jonatan。)
如果我有代表,我会投票赞成这个答案。
相反,我将扩展答案。由于注册表 V2 是在考虑安全性的情况下制作的,因此我认为包含set it up with a self signed cert 和run the container with that cert 的方法是合适的,以便可以使用该证书对其进行 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】:安装 registry: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】:这是一个不错的小班轮(使用 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 这是一个非常有用的小工具。【参考方案9】:除了我必须提供登录详细信息,因为它是本地 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
【讨论】:
【参考方案10】:这是一个示例,它列出了注册表中所有图像的所有标签。它也处理为 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" 对【讨论】:
不错。简单使用 API 和普通的旧 shell 级工具。【参考方案11】:使用“/v2/_catalog”和“/tags/list”端点无法真正列出所有图像。如果您推送了一些不同的图像并将它们标记为“最新”,那么您就无法真正列出旧图像!如果您使用摘要“docker pull ubuntu@sha256:ac13c5d2 ...”引用它们,您仍然可以提取它们。所以答案是——没有办法列出图片你只能列出不一样的标签
【讨论】:
【参考方案12】:我写了一个easy-to-use command line tool 用于以各种方式列出图像(例如列出所有图像、列出这些图像的所有标签、列出这些标签的所有层)。
它还允许您以各种方式删除未使用的图像,例如仅删除单个图像或所有图像的旧标签等。当您从 CI 服务器填充注册表并希望仅保留最新/稳定版本。
它是用python编写的,不需要你下载庞大的自定义注册表图像。
【讨论】:
【参考方案13】:如果有人能走到这一步。
采取其他人已经说过的话。这是一个将答案放入格式为 json 的文本文件中的单行器。
curl "http://mydocker.registry.domain/v2/_catalog?n=2000" | jq . - > /tmp/registry.lst
这看起来像
"repositories": [
"somerepo/somecontiner",
"somerepo_other/someothercontiner",
...
]
您可能需要更改 `?n=xxxx' 以匹配您拥有的容器数量。
Next 是一种自动删除旧的和未使用的容器的方法。
【讨论】:
【参考方案14】:这个话题可以追溯到很久以前,应该考虑的最新工具是skopeo
和crane
。
skopeo
支持签名并具有许多其他功能,而crane
更简约一些,我发现它更容易集成到一个简单的 shell 脚本中。
【讨论】:
这些都是很棒的工具,特别是如果您有特殊的身份验证要求(例如 ActiveDirectory)。【参考方案15】:在撰写本文时,目前不支持 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
【讨论】:
【参考方案16】:由于每个注册表都作为容器运行,因此容器 ID 具有关联的日志文件 ID-json.log,此日志文件包含 vars.name=[image] 和 vars.reference=[tag]。脚本可用于推断和打印这些。这可能是列出推送到注册表 V2-2.0.1 的图像的一种方法。
【讨论】:
【参考方案17】:如果您的用例仅识别 SIGNED 和 TRUSTED 图像用于生产,那么此方法很方便。
它为所有 SIGNED 标签解析一个 docker image 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'
【讨论】:
以上是关于如何获取 docker 注册表 v2 上的图像列表的主要内容,如果未能解决你的问题,请参考以下文章
如何在Docker命令行上的Docker注册表中找到具有特定标记的Docker镜像?
如何使用 Apache 和 CA 证书配置 Docker Registry V2?
在 nginx 代理后面使用 docker 私有注册表 (v2) 的 HTTP 响应格式错误
如何在 docker 中从私有 1.0 注册表中搜索图像? [关闭]