随着harbor的使用,导致harbor的磁盘空间不足.需要进行清理,以下是镜像仓库清理方法
策略支持多个规则,我这里选择的是第一个默认规则,保留最近推送的5个。然后执行的频率是每周,这个频率看每个人的使用场景。
在使用模拟运行确认无误后,一定会要点击“立即运行”。但是运行完成后,持续时间是4秒,可harbor的存储空间并无变化。(仍旧是49GB)
这种方法若是行不通则继续看下面的方法!!!
点击“立即清理垃圾”,看到下面的任务记录。执行立即清理垃圾后,观察镜像库library/icity 的数量,可以看出,最早的标签已被清理。
该方法也是面试时面试官问到的一个方法,是否操作过harbor的gc清理,因为实际生产环境中的项目并没有使用该方法操作过,因此在面试后进行了学习并记录,希望可以帮到大家
1、执行如下的前提是必须保证harbor是处于stop状态,而不能是down状态
docker-compose stop
2、执行
docker run -it --name gc --rm --volumes-from registry vmware/registry-photon:v2.6.2-v1.5.0 garbage-collect --dry-run /etc/registry/config.yml (--dry-run是打印进度而不删除任何数据)
谨记: 如果是down状态,则会报错docker: Error responsefrom daemon: No such container: registry.
3、执行
docker run -it --name gc --rm --volumes-from registry vmware/registry-photon:v2.6.2-v1.5.0 garbage-collect /etc/registry/config.yml
当执行这步操作后,如果发现磁盘空间并未减少多少,则只能证明垃圾回收针对删除的image是起作用的,而harbor的blobs依然会占用很大空间并未释放。
Harbor删除镜像后且GC清理后,磁盘空间没有释放。因为我们push大量相同标签的镜像,Docker 镜像由标签引用,
并由唯一的摘要标识。这意味着如果myImage使用标记推送两个图像,在DR内部他们显示的不同,它们将由两个不同的digests标识。
最后推送的Images是当前的。Docker 镜像由layers组成,每个layers都关联一个blob。该blob是最占用存储的文件; 这些文件将由GC清理。正由上面的描述每个镜像都会存储一个引用,假如,我们重复提交10次,那一个标签在DR中会有10个引用,标签只能获取tag。而其他9个只能用digest获取了。
因此,简单的来说就是因为相同的标签的镜像重复提交次数过多导致blobs占用空间越来越大。
1、通过向docker-compose.yml中添加:
ports:
-127.0.0.1:5000:5000
2、执行以下命令,自行提前拉取该镜像mortensrasmussen/docker-registry-manifest-cleanup
docker pull mortensrasmussen/docker-registry-manifest-cleanup 如下图所示
docker run --network="host" -it -v /data/registry:/registry -e REGISTRY_URL=http://127.0.0.1:5000 mortensrasmussen/docker-registry-manifest-cleanup
3、执行后会清理掉已删除且未使用的那些blobs,如下图所示