抛砖引玉,一个简单畅快的方法清理 Docker 的自建私有仓库 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
CivAx

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

  •  
  •   CivAx 2019 年 4 月 2 日 2322 次点击
    这是一个创建于 2579 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    首先在开工前,你得把 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 为了版面,只好改成括号了。

    1daydayde
        1
    1daydayde  
       2019 年 4 月 2 日
    harbor 很早就有自动清理的功能了,可能你不是用 harbor
    CivAx
        2
    CivAx  
    OP
       2019 年 4 月 2 日
    @0312birdzhang #1 对,这里不是 Harbor,是特指 Docker 的 Registry
    raysonx
        3
    raysonx  
       2019 年 4 月 2 日 via Android
    第一直觉楼主这种简单粗暴的方式可能会存在并发问题,建议仔细了解 registry 的存储和并发控制机制,并充分测试后使用
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3046 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 37ms UTC 06:24 PVG 14:24 LAX 23:24 JFK 02:24
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86