[开源项目]分享一个 Docker 容器瘦身的项目 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题复制粘贴 AI 生成的内容
AIdiot
V2EX    程序员

[开源项目]分享一个 Docker 容器瘦身的项目

  •  
  •   AIdiot 226 天前 3812 次点击
    这是一个创建于 226 天前的主题,其中的信息可能已经有所发展或是发生改变。

    自己开发的一个给 Docker 容器瘦身的工具,在这里分享一下: https://github.com/negativa-ai/BLAFS

    第 1 条附言    226 天前
    统一回复一些问题:
    1. 瘦身后 base image 能否共享?现有的容器瘦身工具做不到,但是这个项目可以做到 -- 有 layer-sharing 模式可以保证 base image 不变,只瘦身容器独有的那些层。其实这是个非常有趣的问题,在项目文档中有一章详细介绍了这个问题;
    2. 瘦身更适合应用类型的、跑特定任务容器,不适合系统类型的、跑很多任务的容器;
    3. 动态分析的可靠性?某些场景下,容器跑的任务非常明确,动态分析足够覆盖掉 corner case 。另外还可以结合已有的单元测试/集成测试去做自动化的动态分析,这里给出了一些例子: https://github.com/negativa-ai/BLAFS/tree/main/examples
    18 条回复    2025-05-06 22:32:49 +08:00
    memcache
        1
    memcache  
       226 天前 via iPhone
    能给镜像瘦身吗?还是给运行中容器瘦身
    AIdiot
        2
    AIdiot  
    OP
       226 天前
    @memcache 给镜像(image)瘦身。
    uid106
        3
    uid106  
       226 天前 via iPhone
    是否可以考虑在 dockerfile 中集成,GitHub action 中直接打包发布瘦身版的镜像
    AIdiot
        4
    AIdiot  
    OP
       226 天前
    @uid106 这个项目是根据运行时分析做瘦身的,应该不容易在 dockerfile 中集成,不过可以写个自动化脚本集成到 Github action 中,这里给了一些自动化瘦身的示例: https://github.com/negativa-ai/BLAFS/tree/main/examples
    cnnblike
        5
    cnnblike  
       226 天前
    这个原理是啥?看起来只是用这个 fs 分析了以下文件的依赖?
    同样的原理是不是也能对 linux 的镜像起作用?
    AIdiot
        6
    AIdiot  
    OP
       226 天前
    @cnnblike 是的,对 Linu 镜像也能起作用
    Alias4ck
        7
    Alias4ck  
       226 天前
    和这个有什么区别 https://github.com/slimtoolkit/slim
    AIdiot
        8
    AIdiot  
    OP
       226 天前
    @Alias4ck 和 slim 的目标是一样的,但是方法不一样。slim 我测试过,一是自动化不太方便,二是对一些复杂的镜像(比如 tensorflow/pytorch ),slim 会导致瘦身后的镜像无法运行。
    AIdiot
        9
    AIdiot  
    OP
       226 天前
    @Alias4ck 我测过 DockerHub Top 20 的容器,slim 只能成功瘦身 8 个,成功率低于一半。
    duzhuo
        10
    duzhuo  
       226 天前
    牛的 看起来好专业,还有论文
    songray
        11
    songray  
       226 天前
    看了一下论文原理,笼统来说,镜像有大量未使用的文件,比如基于 alpine-linux 的一堆容器,可能每个容器运行时你都只需要 usr 目录,别的比如 /bin /etc 压根不会动,那理论上我们可以把 /etc 之类的目录提取出来。

    这个项目引入了一个 去膨胀层 的概念,通过分析容器运行时实际使用的文件,将他们提取出来成为去膨胀层,别的都剔除掉。

    不过这种动态分析的方法可靠性我表示怀疑... 存在太多的 corner case 。有可能这个容器能跑起来别的就跑不起来了,或者基于这个容器导出的镜像打包出来的新镜像就跑不起来了。
    jhdxr
        12
    jhdxr  
       226 天前
    我对最终效果(从 host 的角度看)存疑

    第一点是在分析运行时实际使用的文件这个方面。很有可能存在分析时某个功能并没有触发,导致对应依赖文件被剔除的风险
    第二点是团队的技术栈相似的情况下,base image 很有可能是一样的。那么当我有很多应用的时候,其实 base image 的层本身是复用的。而通过这个途径剔除后的 image ,每个单独看的确都变小了,但从 host 的角度可能反而需要存更多的层。
    xjzshttps
        13
    xjzshttps  
       226 天前
    @jhdxr 赞同,底层系统就那几种,看似体积很大,但是实际是全局很多容器共享,没什么大问题。
    AIdiot
        14
    AIdiot  
    OP
       226 天前
    @xjzshttps 所以这个瘦身主要是针对上层应用容器的,比如用户上传的一些 serverless 容器。
    AIdiot
        15
    AIdiot  
    OP
       226 天前
    @jhdxr 所以这个项目有 layer-sharing 模式,就是只瘦身应用独有的那几层,然后 base image 保持不变,可以参考一下 readme 中的论文有提到这一点。
    caola
        16
    caola  
       226 天前
    瘦身对我来说可能不太需要,
    但我很想找一个能同时支持管理 Docker 和 LXC 的管理系统或者面板,奈何都没有发现有谁在做…
    smallparking
        17
    smallparking  
       226 天前 via Android
    我之前一直使用的是 docker-squash 不知道你这个和 squash 有什么区别
    lonccc
        18
    lonccc  
       225 天前
    star 一个
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5216 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 08:42 PVG 16:42 LAX 00:42 JFK 03:42
    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