如何获取 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 脚本中。

如果您的用例仅识别用于生产的 SIGNEDTRUSTED 图像,那么此方法很方便。

它为所有 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 }'