如何获取 docker registry v2 上的图像列表
How to get a list of images on docker registry v2
我正在使用 docker 注册表 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 上执行此操作的方法吗?
可从 https://github.com/docker/distribution 获得的 Docker 注册表的最新版本支持目录 API。 (v2/_catalog)。这允许搜索存储库
如果有兴趣,您可以尝试 docker 我构建的图像注册表 CLI,以便在新的 Docker 注册表分发中轻松使用 搜索功能 (https://github.com/vivekjuneja/docker_registry_cli)
对于最新(截至 2015-07-31)版本的 Registry V2,您可以从 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
由于每个注册表都作为容器运行,因此容器 ID 具有关联的日志文件 ID-json.log 此日志文件包含 vars.name=[image] 和 vars.reference=[tag ].可以使用脚本来推断和打印这些。这可能是一种列出推送到注册表 V2-2.0.1 的图像的方法。
安装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
这让我发疯了,但我终于把所有的部分都拼凑起来了。截至 2015 年 1 月 25 日,我已经确认可以在 docker V2 注册表中列出图像(与上面提到的 @jonatan 完全相同。)
如果我有代表的话,我会up-vote回答这个问题。
相反,我将扩展答案。由于注册表 V2 是在考虑安全性的情况下创建的,因此我认为包含如何 set it up with a self signed cert, and 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
(如上)必须与为生成的证书指定的域相匹配。
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 注册表并支持通过令牌或基本身份验证进行身份验证。
我写了一个 easy-to-use command line tool 用于以各种方式列出图像(例如列出所有图像、列出这些图像的所有标签、列出这些标签的所有层)。
它还允许您以各种方式删除未使用的图像,例如仅删除单个图像或所有图像的旧标签等。当您从 CI 服务器填写注册表时,这很方便并且只想保留 latest/stable 个版本。
它是用 python 编写的,不需要您下载庞大的自定义注册表映像。
您可以在
上搜索
http://<ip/hostname>
:<port>
/v2/_catalog
获取目录
默认,注册表api return 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
第二个:解析下一个linker url
curl --cacert domain.crt https://your.registry:5000/v2/_catalog
响应中包含一个 link 元素 header:
curl --cacert domain.crt https://your.registry:5000/v2/_catalog
回应header:
Link: </v2/_catalog?last=pro-octopus-ws&n=100>; rel="next"
link元素有本次请求的最后一个条目,那么你可以请求下一个'page':
curl --cacert domain.crt https://your.registry:5000/v2/_catalog?last=pro-octopus-ws
如果响应header包含link元素,您可以在循环中完成。
获取图片
当你得到目录的结果时,它是这样的:
"repositories": [
"busybox",
"ceph/mds"
]
}```
you can get the images in every catalog:
```curl --cacert domain.crt https://your.registry:5000/v2/busybox/tags/list```
returns:
```{"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 中提供了 username/password。
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)打印出 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
下面是一个示例,它列出了注册表中所有图像的所有标签。它也处理为 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
中提取 username:password
- 向注册表发出 https 请求以列出所有 "repositories"
- 将 json 结果过滤为存储库名称的平面列表
- 对于每个存储库名称:
- 向注册表发出 https 请求以列出该 "repository"
的所有 "tags"
- 过滤结果流 json 对象,为每个存储库中找到的每个标签打印 "repository":"tag" 对
使用“/v2/_catalog”和“/tags/list”端点您无法真正列出所有图像。如果您推送了一些不同的图像并标记了它们 "latest",您就无法真正列出旧图像!如果您使用摘要 "docker pull ubuntu@sha256:ac13c5d2..." 引用它们,您仍然可以提取它们。所以答案是 - 无法列出图像,您只能列出不相同的标签
这个线程可以追溯到很久以前,应该考虑的最新工具是 skopeo
and crane
。
skopeo
支持签名并具有许多其他功能,而 crane
更简约一些,我发现它更容易集成到一个简单的 shell 脚本中。
如果您的用例仅识别用于生产的 SIGNED 和 TRUSTED 图像,那么此方法很方便。
它为所有 SIGNED 标签解析 docker 图像存储库,并剥离所有 JSON 格式,仅吐出干净的图像标签。当然可以根据您的要求进一步加工。
命令格式:
docker trust inspect imageName | grep "SignedTag" | awk -F'"' '{print }'
使用 nginx 和 Bitnami Docker 存储库的示例:
docker trust inspect nginx | grep "SignedTag" | awk -F'"' '{print }'
docker trust inspect bitnami/java | grep "SignedTag" | awk -F'"' '{print }'
如果没有签名图片则没有签名或无法访问imageName将被返回。
使用 Wordpress Docker 存储库 WITHOUT 签名图像(在撰写本文时)的存储库示例:
docker trust inspect wordpress | grep "SignedTag" | awk -F'"' '{print }'
我正在使用 docker 注册表 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 上执行此操作的方法吗?
可从 https://github.com/docker/distribution 获得的 Docker 注册表的最新版本支持目录 API。 (v2/_catalog)。这允许搜索存储库
如果有兴趣,您可以尝试 docker 我构建的图像注册表 CLI,以便在新的 Docker 注册表分发中轻松使用 搜索功能 (https://github.com/vivekjuneja/docker_registry_cli)
对于最新(截至 2015-07-31)版本的 Registry V2,您可以从 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
由于每个注册表都作为容器运行,因此容器 ID 具有关联的日志文件 ID-json.log 此日志文件包含 vars.name=[image] 和 vars.reference=[tag ].可以使用脚本来推断和打印这些。这可能是一种列出推送到注册表 V2-2.0.1 的图像的方法。
安装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
这让我发疯了,但我终于把所有的部分都拼凑起来了。截至 2015 年 1 月 25 日,我已经确认可以在 docker V2 注册表中列出图像(与上面提到的 @jonatan 完全相同。)
如果我有代表的话,我会up-vote回答这个问题。
相反,我将扩展答案。由于注册表 V2 是在考虑安全性的情况下创建的,因此我认为包含如何 set it up with a self signed cert, and 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
(如上)必须与为生成的证书指定的域相匹配。
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 注册表并支持通过令牌或基本身份验证进行身份验证。
我写了一个 easy-to-use command line tool 用于以各种方式列出图像(例如列出所有图像、列出这些图像的所有标签、列出这些标签的所有层)。
它还允许您以各种方式删除未使用的图像,例如仅删除单个图像或所有图像的旧标签等。当您从 CI 服务器填写注册表时,这很方便并且只想保留 latest/stable 个版本。
它是用 python 编写的,不需要您下载庞大的自定义注册表映像。
您可以在
上搜索http://
<ip/hostname>
:<port>
/v2/_catalog
获取目录
默认,注册表api return 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
第二个:解析下一个linker url
curl --cacert domain.crt https://your.registry:5000/v2/_catalog
响应中包含一个 link 元素 header:
curl --cacert domain.crt https://your.registry:5000/v2/_catalog
回应header:
Link: </v2/_catalog?last=pro-octopus-ws&n=100>; rel="next"
link元素有本次请求的最后一个条目,那么你可以请求下一个'page':
curl --cacert domain.crt https://your.registry:5000/v2/_catalog?last=pro-octopus-ws
如果响应header包含link元素,您可以在循环中完成。
获取图片
当你得到目录的结果时,它是这样的:
"repositories": [
"busybox",
"ceph/mds"
]
}```
you can get the images in every catalog:
```curl --cacert domain.crt https://your.registry:5000/v2/busybox/tags/list```
returns:
```{"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 中提供了 username/password。
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)打印出 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
下面是一个示例,它列出了注册表中所有图像的所有标签。它也处理为 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 中提取 username:password
- 向注册表发出 https 请求以列出所有 "repositories"
- 将 json 结果过滤为存储库名称的平面列表
- 对于每个存储库名称:
- 向注册表发出 https 请求以列出该 "repository" 的所有 "tags"
- 过滤结果流 json 对象,为每个存储库中找到的每个标签打印 "repository":"tag" 对
使用“/v2/_catalog”和“/tags/list”端点您无法真正列出所有图像。如果您推送了一些不同的图像并标记了它们 "latest",您就无法真正列出旧图像!如果您使用摘要 "docker pull ubuntu@sha256:ac13c5d2..." 引用它们,您仍然可以提取它们。所以答案是 - 无法列出图像,您只能列出不相同的标签
这个线程可以追溯到很久以前,应该考虑的最新工具是 skopeo
and crane
。
skopeo
支持签名并具有许多其他功能,而 crane
更简约一些,我发现它更容易集成到一个简单的 shell 脚本中。
如果您的用例仅识别用于生产的 SIGNED 和 TRUSTED 图像,那么此方法很方便。
它为所有 SIGNED 标签解析 docker 图像存储库,并剥离所有 JSON 格式,仅吐出干净的图像标签。当然可以根据您的要求进一步加工。
命令格式:
docker trust inspect imageName | grep "SignedTag" | awk -F'"' '{print }'
使用 nginx 和 Bitnami Docker 存储库的示例:
docker trust inspect nginx | grep "SignedTag" | awk -F'"' '{print }'
docker trust inspect bitnami/java | grep "SignedTag" | awk -F'"' '{print }'
如果没有签名图片则没有签名或无法访问imageName将被返回。
使用 Wordpress Docker 存储库 WITHOUT 签名图像(在撰写本文时)的存储库示例:
docker trust inspect wordpress | grep "SignedTag" | awk -F'"' '{print }'