我有一个私人 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)
我想删除单个标签,但不一定删除图片。因此,如果我删除标签 2,则可以删除图片,因为没有其他内容引用它。但如果我删除标签 1,则只应删除该标签,而不删除图片。
这表明 API 请求如下:
DELETE http://repo/v2/foo/bar/tags/1
但这给了我 404。相反,我必须删除清单,这意味着要做所有检查工作来确保它没有被其他标签使用。
我查看了https://github.com/fraunhoferfokus/deckschrubber而且它似乎没有检查是否可以安全地删除手稿。我是不是漏掉了什么?
有没有更好的方法?如果没有,原因是什么?这个问题有可能被修复吗?
答案1
目前没有用于删除特定标签的 API理论上,您可以将新的(可能是空的)清单推送到现有标签,然后删除它。否则,您需要在清理例程中跟踪所有标签和清单,以确定哪些是可以安全删除的。
更新:
标签删除功能已添加到现在的 1.0 版本OCI 分布规范。 接着就,随即,拉取请求(#3427)已批准分发/分发,这是注册表映像的上游。它具有 3.0 版本的里程碑,因此这可能是将来添加的功能。
我也一直在努力注册客户端它既实现了标签删除 API,又返回推送空清单并删除它。对于 CLI,regclient 包含 regctl,如下所示:
regctl tag rm registry:5000/repo:tag