这是可行的,虽然丑陋。您需要运行(我认为)注册表 2.3 或更高版本,并启用删除(REGISTRY_STORAGE_DELETE_ENABLED=True
env var 或等效项)。下面的示例命令假设一个本地文件存储在 中/srv/docker-registry
,但是如果不能为其他存储后端制作等效的东西,我会感到惊讶。
对于您希望整理的每个存储库,您需要枚举不再需要的摘要引用。最简单的方法是每个标签,latest
在这种情况下使用作为示例,您可以执行以下操作:
ls -1tr /srv/docker-registry/v2/repositories/<repo>/_manifests/tags/latest/index/sha256 \
| tail -n +3
latest
这将列出推送到标签的三个最新摘要之外的所有摘要。或者,如果您不太关心标签,而只想保留最后几个引用,您可以这样做:
ls -1t /srv/docker-registry/v2/repositories/<repo>/_manifests/revisions/sha256 \
| tail -n +3
然后,您只需删除不需要的引用:
for hash in $(ls -1t /srv/docker-registry/v2/repositories/<repo>/_manifests/tags/latest/index/sha256 | tail -n +3); do
curl -X DELETE https://registry:5000/v2/<repo>/manifests/sha256:$hash
done
最后,您需要执行一次 GC 运行,因为注册表实现了“软删除”,它实际上并没有删除任何内容,它只是使其不可用:
docker exec docker-registry /bin/registry \
garbage-collect /path/to/config.yml
是的,这一切都乱七八糟,在后端存储中徘徊,因为没有 API 方法可以枚举与给定标签关联的所有摘要,但这就是 cookie 崩溃的方式。