Docker Registry 2.0 – 如何删除未使用的图像?

我们更新了我们的私人dockerregistry到官方的registry2.0。 这个版本现在可以删除由hashtag标识的docker镜像(请参阅https://docs.docker.com/registry/spec/api/#deleting-an-image ),但是我仍然没有看到清理旧镜像的方法。

由于我们的CI服务器不断产生新的图像,我需要一种方法来删除私有registry中的所有图像,这些图像不再由命名标签标识。

如果没有内置的方法来实现这一点,我认为一个自定义脚本可能工作,但我没有看到一个V2 API方法列出所有存储的图像的标签。

我怎样才能保持我的私人registry清洁? 任何提示?

删除图像(您可以保留10个最新版本,就像我在CI中那样)分三步完成:

  1. 通过设置环境variablesREGISTRY_STORAGE_DELETE_ENABLED: "true"并将其传递给docker-registry来启用图像删除

  2. 运行下面的脚本(它会删除所有的图像和标签,但保留最后10个版本)

    registry.py -l user:pass -r https://example.com:5000 –delete –num 10

  3. 运行垃圾收集(你可以把它放到你的日常cron任务中)

    docker-compose -f [path_to_your_docker_compose_file]运行registrybin /registrygarbage-collect /etc/docker/registry/config.yml

registry.py可以从下面的链接下载,它也允许列出图像,标签和图层,以及删除特定的图像和/或标签。

https://github.com/andrey-pohilko/registry-cli

在垃圾回收之前,我的registry文件夹是7 Gb,在我运行上面的步骤之后,它缩小到了1 Gb。

这是可行的,虽然丑陋。 你需要运行(我认为)registry2.3或更高,并已启用删除( REGISTRY_STORAGE_DELETE_ENABLED=Truevariables或同等学历)。 下面的示例命令假设在/srv/docker-registry有一个本地文件存储,但是如果某个等价物无法用于其他存储后端,我会感到惊讶。

对于每个需要整理的存储库,您需要枚举不再需要的摘要引用。 最简单的方法是使用latest标签作为例子,你可以这样做:

 ls /srv/docker-registry/v2/repositories/<repo>/_manifests/tags/index/latest/index/sha256 -t | tail -n +3 

这将列出除最近推出的latest三个摘要之外的所有内容。 或者,如果您不太在乎标签 ,但只是想保留最后几个参考,您可以这样做:

 ls /srv/docker-registry/v2/repositories/<repo>/_manifests/revisions/sha256 -t | tail -n +3 

然后,你只需删除你不需要的引用:

 for hash in ls /srv/docker-registry/v2/repositories/<repo>/_manifests/tags/index/latest/index/sha256 -t | tail -n +3); do curl -X DELETE https://registry:5000/v2/<repo>/manifests/sha256:$hash; done 

最后,你需要做一个GC运行,因为registry实现了“软删除”,它实际上并没有删除任何东西,只是使其不可用:

 docker exec docker-registry /bin/registry garbage-collect /path/to/config.yml 

是的,这是一团乱麻,在后端存储中徘徊,因为没有API方法来枚举与给定标签相关联的所有摘要,但这就是cookie崩溃的方式。

有一些讨论正在devise这个 – 现在,没有图层清理工具/端点。

我会鼓励你去:

和/或通过#docker-distribution上的Freenode IRC进行访问。

我正在寻找在registryv2 api相同的function,但只发现软删除这不是我正在寻找。 在研究中,我发现了Github项目delete-docker-registry-image ,它通过bash脚本从安装卷中删除实际文件。 未经testing,可能有用…

我把这个线程的各个部分拼凑在一起,并在bash中创build了一个易于使用的清理脚本。你可以在这个要点清理clean.sh