首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  Docker

docker 镜像过大的问题

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

    自己写 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
        1
    phithon   2017-05-12 03:48:17 +08:00
    删除依赖用的是 apt-get purge -y --auto-remove ...
        2
    evlos   2017-05-12 03:57:45 +08:00 via iPhone
    Remove 和安装命令写到同一行试试
        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
        4
    cyr1l   2017-05-12 06:28:38 +08:00 via iPhone   ♥ 1
    楼上说的对,RUN 命令要尽量写在一条里,每次 RUN 命令都是在之前的镜像上封装,只会增大不会减小

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

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

    但是更好的做法是 5 楼贴的我的文章,用两段构建,绝对纯净。 只要你的 docker 升级到了 5 月的最新版。
        12
    cloverstd   2017-05-12 10:48:57 +08:00   ♥ 1
        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
        14
    ETiV   2017-05-12 12:49:54 +08:00 via iPhone
    你要是懒得折腾 就 docker export 成打包文件

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

    然后再 docker import 就行了
        15
    phithon   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 里……
        16
    Muninn   2017-05-12 23:13:14 +08:00
    @phithon 可能追求不一样 有的镜像是为了逻辑更清晰。

    官方两段构建刚出来几天,还没有啥官方镜像用,只要你的 docker 是最新的就可以上手用了。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2684 人在线   最高记录 4346   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 18ms · UTC 11:48 · PVG 19:48 · LAX 03:48 · JFK 06:48
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1