从私有 Docker 注册表中删除标签的简单方法?

Pet*_*ake 9 docker docker-registry

我有一个私有 Docker 注册表 v2.6.0,其中包含一个映像上的几个标记版本:

foo/bar:1
foo/bar:1_keep    (same image as 1)
foo/bar:2
foo/bar:3
foo/bar:latest    (same image as 3)
Run Code Online (Sandbox Code Playgroud)

我想删除单个标签而不必删除图像。因此,如果我删除标签 2,则可以删除该图像,因为没有其他内容引用它。但是如果我删除标签 1,只有那个标签应该去,而不是图像。

这表明 API 请求是这样的:

DELETE http://repo/v2/foo/bar/tags/1
Run Code Online (Sandbox Code Playgroud)

但这给了我一个 404。相反,我必须删除清单,这意味着做所有检查它没有被另一个标签使用的工作。

我查看了https://github.com/fraunhoferfokus/deckschrubber的来源,它似乎并没有在检查删除手稿是否安全时遇到麻烦。我错过了什么吗?

有没有更好的方法来做到这一点?如果没有,为什么不,它可能会被修复?

BMi*_*tch 7

目前没有用于删除特定标签的 api。从理论上讲,您可以将新的(可能是空的)清单推送到现有标签,然后将其删除。否则,您将需要跟踪清理例程中的所有标签和清单,以确定可以安全删除的内容。


更新:

标记删除已添加到现在的 1.0 OCI 分发规范中。这样,拉取请求 (#3427)被批准分发/分发,这是注册表映像的上游。它获得了 3.0 版本的里程碑,因此这可能是将来添加的功能。

我还一直在研究regclient,它实现了标签删除 API,并退回到推送空清单并删除它。对于 CLI,regclient 包括 regctl,它看起来像:

regctl tag rm registry:5000/repo:tag
Run Code Online (Sandbox Code Playgroud)

  • 我四处搜索,看起来删除特定标签不会很快发生。(也许永远不会根据https://github.com/docker/distribution/issues/1566#issuecomment-205484205) (2认同)