V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
CivAx
V2EX  ›  程序员

抛砖引玉,一个简单畅快的方法清理 Docker 的自建私有仓库

  •  
  •   CivAx · 2019-04-02 19:32:02 +08:00 · 1982 次点击
    这是一个创建于 2097 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这个方法肯定不是最好的,但我目前还没有找到过更好的,在此抛砖引玉。

    首先在开工前,你得把 Registry 的目录挂进去。也就是这个仓库容器在 run 的伊始,必须要 [ -v /transfer/registry:/var/lib/registry ],挂载目录你可以随便定义,我定义的是 [ /transfer/registry ]

    耳熟能详的 [ registry garbage-collect /etc/docker/registry/config.yml ] 命令,实际上流程是:先检查 [ /repositories/${项目名}/_manifests/revisions/sha256 ] 有哪些 sha256,然后跟 Blobs 中的 sha256 进行匹配,如果两者有差异,那么删除 blobs 中多余的部分。

    也就是说使用垃圾回收命令的核心在于必须先在对应项目的 [ _manifests/revisions ] 中删除对应的 sha256。

    要知道每一个 Layer 在仓库中都是以 sha256 的形式被标记,每一个 tags 文件夹中都存在一个 link 文件,里面记录这个 tags (俗称版本) 对应的 sha256。那么按照随手能 Google 到的各种清理教程所述,清理废弃镜像的方法应该是:记录 <要被删除> 的 tags 的 sha256,删除 tags,根据获得的 sha256,去 [ /repositories/${项目名}/_manifests/revisions/sha256 ] 中删除对应的文件夹,然后执行 garbage-collect 命令。

    看起来很繁琐对吧?少废话,先看东西,上懒人脚本。

    #!/bin/bash
    
    shopt -s extglob
    
    AbandonImg=`ls -l /transfer/registry/docker/registry/v2/repositories/ | awk '{print $9}'| tail -n +3`
    
    for i in $AbandonImg
    do
            cd /transfer/registry/docker/registry/v2/repositories/$i/_manifests/revisions/sha256 && rm -rf !($(cat ../../tags/*/current/link | sed 's/sha256:/|/g'))
    done
    
    docker exec -it ${仓库容器名} sh -c 'registry garbage-collect /etc/docker/registry/config.yml'
    

    核心命令只有一个,rm !():获取目前所有项目的 tags 文件夹中的 sha256 信息,然后在 revisions 文件夹中反选删除这些 sha256.也就是说在 “ revisions 文件夹” 中,删除任何 “ tags 文件夹” 中不存在的 sha256.

    这也就是为什么说要把目录挂进去。registry 镜像所用基础 OS Alpine 只有 sh,没有 bash,而 sh 是不支持 shopt 命令的,也就不能实现反选。

    那么删 sha256 的实现了,tags 过多成百个,删得手累怎么办?

    这里就要用到我们神奇的 ncdu 文件管理工具了,能在命令行下实现仅次于 [rm -rf * ] 命令的超高效率的删除。也就是说,使用 ncdu 工具,进入到 [ /_manifests/tags/ ]文件夹中,删除不需要的版本号,然后执行一次上面的脚本,整个清理流程就结束了。推荐在删除完成后重启一下仓库(精神洁癖)

    注:脚本请在充分测试后使用;部分参数与路径需要根据实际情况替换; tail 与 awk 命令可能会因为不同的系统打印不同的结果,此脚本在 CentOS 7.6.1810 中编写。


    V2 不支持单双反引号的高亮格式,emmmm 为了版面,只好改成括号了。

    0312birdzhang
        1
    0312birdzhang  
       2019-04-02 19:34:41 +08:00
    harbor 很早就有自动清理的功能了,可能你不是用 harbor
    CivAx
        2
    CivAx  
    OP
       2019-04-02 19:37:34 +08:00
    @0312birdzhang #1 对,这里不是 Harbor,是特指 Docker 的 Registry
    raysonx
        3
    raysonx  
       2019-04-02 19:41:57 +08:00 via Android
    第一直觉楼主这种简单粗暴的方式可能会存在并发问题,建议仔细了解 registry 的存储和并发控制机制,并充分测试后使用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1043 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:39 · PVG 07:39 · LAX 15:39 · JFK 18:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.