私有仓库磁盘占满需先定位瓶颈再分步清理:先标记待删(如nexus3的purge任务、harbor垃圾回收),再执行物理释放(如compact blob store或registry garbage-collect),并配合自动化脚本与源头管控。

私有仓库磁盘占满不是单纯删几个镜像就能解决的问题,关键在于区分“逻辑删除”和“物理释放”。Nexus3、Harbor、Docker Registry等主流私有仓库都有类似机制:界面或API删除操作只是标记资源为“待清理”,真正腾出磁盘空间需要后续强制回收步骤。
先确认到底占了谁的空间
别急着删,先定位瓶颈:
- 登录仓库管理后台(如 Nexus3 的 Repository → Browse),按大小排序查看哪些仓库/镜像占用最高;
- 进服务器执行 du -sh /path/to/registry/storage/* 或 du -sh /nexus-data/blobs/,看实际目录层级哪一块最胀;
- 对 Docker Registry,运行 registry garbage-collect --dry-run /etc/docker/registry/config.yml 查看可清理量;对 Nexus3,用 du -sh blobs/ + find blobs/ -name "*.properties" | wc -l 对比总 blob 数与活跃数,差值越大说明待清理越多。
分步执行真正的空间释放
删完不释放 = 白删。必须按顺序走完两步:
- Purge unused manifests and images:在 Nexus3 中是 Scheduled Task → “Purge unused docker manifests and images”;在 Harbor 中对应“垃圾回收”按钮;这是清除镜像引用关系,让底层 blob 被标记为可回收;
- Compact blob store(Nexus3)或 Garbage Collect(Registry):Nexus3 运行 “Compact blob store” 任务;Docker Registry 执行 registry garbage-collect /etc/docker/registry/config.yml(需 registry 容器重启或 reload);这一步才真正删文件、整理碎片、释放磁盘。
用脚本自动化高频操作
人工点几次容易漏,尤其 CI/CD 频繁推送的环境:
- 写一个 nexus-cli 脚本:先调 API 批量删除超过 30 天的
myapp:*标签镜像,再触发 purge + compact 两个 task; - 对 Harbor,用 harbor-cli 或官方 API 清理指定项目下未被任何 tag 引用的 artifact,再调用
/system/gc/schedule; - 加 cron 定时:比如每天凌晨 1 点执行清理脚本,每周六凌晨 3 点执行 full compact/gc。
从源头控制膨胀趋势
治标更要治本:
- CI 流水线里禁止无标签推送(
docker push my-registry/app:),强制带语义化 tag 或 commit hash; - 构建阶段启用 BuildKit 并配置
DOCKER_BUILDKIT=1,它默认更激进地复用层、减少中间镜像; - 基础镜像统一用精简版(如
alpine、distroless),避免在 Dockerfile 里反复RUN apt-get install && rm -rf /var/lib/apt/lists/*这类无效操作——删不掉已写入的层; - 在 Nexus3/Harbor 后台开启自动清理策略:比如保留最近 5 个 tag、自动删除 60 天前未拉取的镜像。











