批量 docker 注册表清单删除:如何通过 v2 REST API 列出清单?



我想远程删除我的私有 docker 注册表 (v2 api) 中的特定或所有清单,以便 gc 可以收集图像数据。我找到了这个工具,但它仅适用于标签。我决定延长它。我想列举清单。是否可以获取清单列表?我找不到有用的东西。

我检查了这些,我也在网上搜索,但没有成功。

  • https://docs.docker.com/registry/spec/api/
  • https://docs.docker.com/registry/garbage-collection/

--更新--

当然,两者都会导致 404 错误(我只是更喜欢使用wget)。为

https://<registry-origin>/v2/gk-backend/tags/list

正如我所期望的那样,我得到了{"name":"gk-backend","tags":["latest"]}。当我尝试父亲获取清单时,我有 404。我通过使用类似wget发出请求

wget --method=HEAD --header="Accept: application/vnd.docker.distribution.manifest.v2+json" --no-check-certificate --http-user user --http-password pass https://<registry-origin>/v2/wjs-wealth/manifests/gk-backend:latest -O- 

curl也给了我404

curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -sI --user user:pass https://<registry-origin>/v2/wjs-wealth/manifests/gk-backend:latest

我有同样的问题。如果具有相同标记的 docker 映像(称为清单)推送到 Docker 注册表 v2.0,则新清单将采用该标记,而旧清单将不会删除,而是不存在且未分配标记。

此类旧清单在不知道其摘要的情况下无法从 REST API 列出,垃圾回收不会删除它们。

我发现获取 docker 注册表存储库清单列表的一种方法是通过垃圾收集工具。运行docker exec -it registry registry garbage-collect --dry-run /etc/docker/registry/config.yml.此命令将打印所有存储库的所有清单(包括分配的标记)。如:

hello-world
hello-world: marking manifest sha256:fea8895f450959fa676bcc1df0611ea93823a735a01205fd8622846041d0c7cf
hello-world: marking blob sha256:03f4658f8b782e12230c1783426bd3bacce651ce582a4ffb6fbbfa2079428ecb
hello-world: marking blob sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
hello-world: marking configuration sha256:690ed74de00f99a7d00a98a5ad855ac4febd66412be132438f9b8dbd300a937d
ubuntu
4 blobs marked, 0 blobs eligible for deletion

使用grep工具,很容易仅过滤掉清单信息。

然后,可以调用删除 REST API 来删除未使用的清单。请注意不要删除分配了标记的清单

删除 REST API 仅删除清单信息,Blob 中的图像数据不会删除,因此在不--dry-run的情况下再次运行垃圾回收命令以删除未使用的 Blob:docker exec -it registry registry garbage-collect /etc/docker/registry/config.yml

您需要运行此命令以获取标签列表

curl https://<registry>/v2/<repoName>/tags/list

现在我们想要每个标签的清单 - 因为我们不想按照 comphilip 的答案删除它。

curl -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -sI "https://<registry>/v2/<repoName>/manifests/<tag>" | grep "Docker-Content-Digest" | sed 's/Docker-Content-Digest: //;s/r$//'      

包含标头非常重要,否则您将获得不同的 Docker-Content-Digest。

这将为您提供需要排除的清单列表。

或者,您可以使用此方法:docker 注册表清理

最新更新