【问题标题】:docker container size much greater than actual sizedocker 容器大小远大于实际大小
【发布时间】:2015-10-16 03:27:25
【问题描述】:

我正在尝试从debian:latest 构建图像。构建后,docker images 命令报告的映像虚拟大小为 1.917 GB。我登录查看大小 (du -sh /),它是 573 MB。我很确定这种巨大的尺寸通常是不可能的。这里发生了什么?如何获得正确大小的图像?更重要的是,当我推送此存储库时,大小为 1.9 GB 而不是 573 MB。

du -sh /*的输出

8.9M    /bin
4.0K    /boot
0   /dev
1.1M    /etc
4.0K    /home
30M /lib
4.0K    /lib64
4.0K    /media
4.0K    /mnt
4.0K    /opt
du: cannot access '/proc/11/task/11/fd/4': No such file or directory
du: cannot access '/proc/11/task/11/fdinfo/4': No such file or directory
du: cannot access '/proc/11/fd/4': No such file or directory
du: cannot access '/proc/11/fdinfo/4': No such file or directory
0   /proc
427M    /root
8.0K    /run
3.9M    /sbin
4.0K    /srv
0   /sys
8.0K    /tmp
88M /usr
15M /var

【问题讨论】:

    标签: linux docker debian


    【解决方案1】:

    您是否通过 Dockerfile 构建该映像?当您这样做时,请注意您的 RUN 声明。当您执行多个RUN 语句时为每个语句创建一个新图像,该图像保留在图像历史记录中并计算图像总大小。

    因此,例如,如果一个 RUN 语句下载了一个巨大的存档文件,下一个语句解压缩该存档文件,然后接下来的一个清理该存档文件其提取的文件保留在图像历史中

    RUN curl <options> http://example.com/my/big/archive.tar.gz
    RUN tar xvzf <options>
    RUN <do whatever you need to do with the unpacked files>
    RUN rm archive.tar.gz
    

    就图像大小而言,有更有效的方法可以使用&amp;&amp; 运算符在一个RUN 语句中组合多个步骤。喜欢:

    RUN curl <options> http://example.com/my/big/archive.tar.gz \
        && tar xvzf <options> \
        && <do whatever you need to do with the unpacked files> \
        && rm archive.tar.gz
    

    通过这种方式,您可以清理构建过程所需但不在生成的映像中的文件和文件夹,并将它们排除在映像历史记录之外。这是保持图像尺寸较小的一种非常常见的模式。

    但当然,您不会拥有可以重复使用的细粒度图像历史记录。

    更新:

    除了RUN 语句ADD 语句还创建新的图像层。无论您以何种方式添加到图像中,它会保留在历史记录中,并取决于图像的总大小。您不能暂时 ADD 事物然后删除它们,这样它们就不会计算总大小。

    尽量少用ADD的图片。尤其是在处理大文件时。是否有其他方法可以在 RUN 语句中临时获取这些文件,以便您可以在同一 RUN 执行期间进行清理?例如。 RUN git clone &lt;your repo&gt; &amp;&amp; &lt;do stuff&gt; &amp;&amp; rm -rf &lt;clone dir&gt;?

    一个好的做法是只 ADD 那些应该留在图像上的东西。应尽可能使用单个 RUN 语句添加和清理临时内容。

    【讨论】:

    • RUN 语句可以合并,是的,它确实减小了大小。但是我有一个 ADD 语句,一个 RUN 语句来安装和删除安装文件。如何结合这些?
    • 您不能ADD 安装文件,然后使用RUN 语句将其删除。那将保留在图像历史记录中。如果有办法使用RUN 语句来做到这一点,那将是解决方案。我相应地更新了我的答案。
    • 这实际上帮助我将图像大小减少了 50% 以上。
    【解决方案2】:

    1.9GB 大小不是图像,而是图像及其历史。使用docker history textbox 检查占用了这么多空间。

    另见Why are Docker container images so large?

    要减小大小,您可以更改构建映像的方式(这取决于您的操作,请参阅上面链接中的答案),使用 docker export(请参阅How to flatten a Docker image?)或使用other extensions

    【讨论】:

    • 那么 docker push 应该怎么做才能只推送图片(573MB)?
    • 可能不是 SO 的主题;也许是服务器故障?
    • 我更新了我的答案。 @rholmes:我不知道,我在 SO 上看到的关于这个问题(图像大小)的问题比在服务器故障上看到的问题更多。
    • 是的,我明白你的意思...看来,SO 的周转速度很快,而且比其他任何人的眼睛都多。
    • SO 或 SF 适合 docker 问题,因为 docker 被开发人员广泛使用:meta.stackoverflow.com/questions/276579/…
    猜你喜欢
    • 1970-01-01
    • 2016-12-11
    • 2023-03-17
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多