docker 镜像过大的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
phithon
V2EX    Docker

docker 镜像过大的问题

  •  
  •   phithon
    phith0n 2017-05-12 03:37:21 +08:00 13818 次点击
    这是一个创建于 3094 天前的主题,其中的信息可能已经有所发展或是发生改变。

    自己写 dockerfile,编译某个软件,编译的过程中 apt-get 装了一大堆依赖,下载了大量东西。

    编译完成后我就用 apt-get autoremove 把所有不必要的依赖全删了。

    镜像生成后用docker images查看,有 1.8G。然后用该镜像生成容器,进入容器内部,用du -sh /查看,其实才 300 多 M。

    所以其实那些依赖确实已经删除了,但镜像文件依旧很大,可能是 docker 镜像某一层里这些编译过程还是没有删。

    如此说来,那我 autoremove 不就没有必要了么?为什么我看官方几乎所有的镜像,编译的时候还是会 autoremove ?这种没必要的编译过程仍然被记录下来,会不会挤爆 dockerhub ……

    而且我发现,docker 官方的一些镜像,虽然也都是手工编译的,但其大小好像也都不大啊,一般就 100MB,比如 httpd 压缩以后才 60 多 M,这是怎么做到的。。。

    如果我想把自己编译的镜像全部保存到本地(用 docker save ),如何才能尽量减小他们的体积?

    第 1 条附言    2017-05-12 15:22:09 +08:00
    我学 dockerfile 是跟官方学的,我看官方的一些 dockerfile 并没有写在一起,比如 php 的 https://github.com/docker-library/php/blob/6844e717a56a5dd8ad87a236a96bea069cc635fd/7.1/apache/Dockerfile
    httpd 的 https://github.com/docker-library/httpd/blob/e885c0d63078153dc89fa0212314e590fec7fc93/2.4/Dockerfile
    apt-get install 和 apt-get purge 是在不同的 RUN 里……
    好嘞,我学习一下新的方法
    第 2 条附言    2017-05-12 15:23:21 +08:00
    我应该看看 alpine 的 dockerfile 的,以前看的都是基于 debian 的……
    16 条回复    2017-05-12 23:13:14 +08:00
    phithon
        1
    phithon  
    OP
       2017-05-12 03:48:17 +08:00
    删除依赖用的是 apt-get purge -y --auto-remove ...
    evlos
        2
    evlos  
       2017-05-12 03:57:45 +08:00 via iPhone
    Remove 和安装命令写到同一行试试
    ryd994
        3
    ryd994  
       2017-05-12 06:28:20 +08:00 via Android   1
    1. alpine apk virtual 很好用
    2. 一次 RUN 就是一层,层与层之间删文件不减大小
    3. 自己编译的话试试 squash
    4. docker hub 的话试试 multi-stage build
    cyr1l
        4
    cyr1l  
       2017-05-12 06:28:38 +08:00 via iPhone   1
    楼上说的对,RUN 命令要尽量写在一条里,每次 RUN 命令都是在之前的镜像上封装,只会增大不会减小

    除此之外,可以选择比较小的基础镜像,比如 alpine , 一个 包含 nginx 的 alpine 镜像才十几兆.
    gamexg
      &nbp; 5
    gamexg  
       2017-05-12 07:26:24 +08:00 via Android   4
    Docker 重要更新: 原生支持多阶段构建(multi-stage build)
    https://juejin.im/post/58f093b2a22b9d006ce69587
    paranoiagu
        6
    paranoiagu  
       2017-05-12 08:03:01 +08:00 via Android
    apt 安装,编译,remove 要一气呵成。
    neighbads
        7
    neighbads  
       2017-05-12 08:33:35 +08:00
    RUN 在一行写完。。。。
    tinyproxy
        8
    tinyproxy  
       2017-05-12 08:40:10 +08:00 via iPhone   1
    才 1.8g。。。你看看隔壁巨硬的 iis,6 个 g 看的我怀疑人生
    Eleutherios
        9
    Eleutherios  
       2017-05-12 08:57:48 +08:00   1
    …… 写在一层里啊

    RUN apt-get install ** &&\
    你的代码 &&\
    apt-get autoremove ** &&\
    apt-get clean all && rm -fr **
    mritd
        10
    mritd  
       2017-05-12 09:49:53 +08:00 via iPhone
    三楼回答的已经很好了,你可以再参考一下 nginx-alpine 的 dockefile,应该很有参考价值
    Muninn
        11
    Muninn  
       2017-05-12 10:03:42 +08:00   1
    直接的回答就是 docker 镜像是 git 的机制,安装和移除必须写在一行。 参考各大项目的 Dockerfile 就能看明白。

    但是更好的做法是 5 楼贴的我的文章,用两段构建,绝对纯净。 只要你的 docker 升级到了 5 月的最新版。
    cloverstd
        12
    cloverstd  
       2017-05-12 10:48:57 +08:00   1
    l142857
        13
    l142857  
       2017-05-12 11:57:06 +08:00
    @Muninn 提到的两段构建的玩法,一年前我们在自己开发的镜像制作管理工具中实现过: https://github.com/CtripCloud/docker-make#two-images-one-for-compile-one-for-deployment
    ETiV
        14
    ETiV  
       2017-05-12 12:49:54 +08:00 via iPhone
    你要是懒得折腾 就 docker export 成打包文件

    export 的不包含层信息,只有最后的文件系统

    然后再 docker import 就行了
    phithon
        15
    phithon  
    OP
       2017-05-12 15:18:26 +08:00
    @Muninn
    知道了,安装和移除写在一行,可以减小大小。
    不过官方的一些 dockerfile 并没有写在一起呀,比如 php 的 https://github.com/docker-library/php/blob/6844e717a56a5dd8ad87a236a96bea069cc635fd/7.1/apache/Dockerfile
    httpd 的 https://github.com/docker-library/httpd/blob/e885c0d63078153dc89fa0212314e590fec7fc93/2.4/Dockerfile
    apt-get install 和 apt-get purge 是在不同的 RUN 里……
    Muninn
        16
    Muninn  
       2017-05-12 23:13:14 +08:00
    @phithon 可能追求不一样 有的镜像是为了逻辑更清晰。

    官方两段构建刚出来几天,还没有啥官方镜像用,只要你的 docker 是最新的就可以上手用了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     951 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 22:14 PVG 06:14 LAX 15:14 JFK 18:14
    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