如何清理Sonatype Nexus Docker Registry中的老旧/未使用镜像?
解决Sonatype Nexus Docker Registry清理任务无效的问题
我之前也碰到过Nexus Docker仓库越用越大、自带清理任务完全没效果的糟心事,折腾了好一阵才找到症结,给你分享几个实用的排查和解决步骤:
先核对清理任务的配置细节
很多时候任务没起效,根本原因是规则没覆盖到要清理的镜像:- 确认任务的Repository Target是不是准确选中了你的Docker仓库,别不小心选成maven或者其他类型的仓库了
- 检查“Unused”的时间阈值设置——默认是按最后拉取/推送时间判定的,如果设得太长(比如30天),但你的旧镜像才存了10天,那肯定不会被清理
- 一定要勾选**"Remove manifests that have no tags"**选项!CI构建经常会生成无标签的镜像(只推送了manifest没打tag),这些“无头”镜像默认不会被清理,勾上这个才能把它们删掉
注意Docker镜像的分层特性,别被“假占用”骗了
Nexus里的Docker镜像是分层存储的,不同镜像会共享相同的层。哪怕你删了某个镜像,只要还有其他镜像在依赖它的分层,那这个分层的Blob文件就不会被删除。所以你看到空间没下降,可能是还有其他镜像在占用这些分层:- 先手动清理仓库里确定没用的旧项目镜像(包括所有关联的tag)
- 执行完清理任务后,必须去Blob Store里运行**"Compact Blob Store"**任务——这个步骤才会真正删除那些没有任何引用的孤立Blob,释放出实际的存储空间
强制触发完整清理流程
如果自动任务一直没效果,可以手动走一遍完整的清理流程:- 先暂停你的Docker仓库(避免清理过程中有新的镜像推送干扰)
- 手动运行**"Purge unused docker manifests and images"**任务,确保选对目标仓库和合适的时间阈值
- 运行**"Compact Blob Store"**任务,选择对应Docker仓库的Blob存储
- 最后重启Nexus服务(有时候缓存会导致后台空间统计没及时更新)
长期预防的小建议
- 在CI流程里加个步骤:每次推送新镜像后,自动删除该项目的旧镜像(比如只保留最近3个版本),从源头减少垃圾堆积
- 给Docker仓库设置**"Tag Retention Policy"**,自动清理超过指定数量的tag,避免tag越积越多
- 定期手动检查Blob存储的占用情况,别完全依赖自动清理任务
内容的提问来源于stack exchange,提问作者Matej Žerovnik
相关产品推荐
相关产品推荐

