当前位置: 首页 > 知识库问答 >
问题:

docker容器大小远大于实际大小

鞠征
2023-03-14

我正在尝试从debian:最新的构建镜像。构建后,docker image命令报告的镜像虚拟大小为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

共有2个答案

柏正平
2023-03-14

1.9GB大小不是图像,而是图像及其历史记录。使用docker历史文本框检查是什么占用了这么多空间。

另请参见Docker容器图像为什么如此大?

要减小大小,您可以更改构建图像的方式(这取决于您的操作,请参见上面链接中的答案),使用docker export(请参见如何展平docker图像?)或使用其他扩展。

袁阿苏
2023-03-14

您是否通过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

在图像大小方面,有更有效的方法可以使用在一个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语句中的文件,以便在执行相同的RUN语句时进行清理?E、 g.<代码>运行git克隆

一个好的做法是只添加那些要留在图像上的东西。在可能的情况下,应该使用一条RUN语句来添加和清理临时内容。

 类似资料:
  • 问题内容: 我得到一个JFrame,我想显示一个带有边框的JLabel,其填充可能为50px。当我将JFrame的大小设置为750、750并将JLabel的大小设置为650、650并将位置设置为50、50时,它显示为奇怪……这是我的代码: 因此,我认为顶部的标题栏也包含在大小中。在图形中,您可以使用。现在,Swing / JFrame有类似的东西吗? 问题答案: 首先获取由帧修剪的像素。 另一种更

  • 我用两个容器运行docker的环境。我注意到Overly2文件夹太大了。当docker关闭(docker compose down)时,Overly2文件夹的大小为2.3GB。当容器运行时,Overly2文件夹将增加到4.0GB,并且随着时间的推移而增加。这正常吗? 命令停止容器: 命令,容器运行: 编辑 命令

  • 自定义线程池的建议大小是number_of_cores+1(请参见此处和此处)。假设有一个Spring应用程序在一个系统上有两个核心,配置如下所示 在这种情况下,将有一个ExecutorService在几个请求之间共享。因此,如果有10个请求到达服务器,那么在ExecutorService中只能同时执行其中的3个请求。这可能会产生瓶颈,并且随着请求数量的增加,结果会变得更糟(请记住:默认情况下,t

  • 问题内容: 最近,我从运行jboss的centos基本映像创建了一个docker容器。最初,我安装了jdk(并已提交),该容器使容器体积庞大(约850M)。后来,我卸载了jdk并安装了jre。从容器内部 仅显示440M。但是将更改提交到映像后,它仍然显示711M。图像尺寸是否应与容器的 du 不匹配(或接近)?还是在提交时,码头工人会继续添加旧版本(例如SCM)吗? 谢谢 问题答案: 回答我自己的

  • 问题内容: 对于我的应用程序,Java进程使用的内存远远大于堆大小。 容器运行所在的系统开始出现内存问题,因为容器占用的内存比堆大小大得多。 堆大小设置为128 MB(-),而容器最多占用1GB的内存。正常情况下需要500MB。如果docker容器的限制低于(例如),则该进程将被操作系统的内存不足杀手杀死。 你能解释一下为什么Java进程使用的内存比堆多得多吗?如何正确调整Docker内存限制的大

  • 我正在运行Apache Ignite应用程序。当我看到使用linux的内存使用时,我得到的使用内存为9.8GB。但是当我使用eclipse MAT进行堆转储时,它的大小只有大约1.8GB。为什么会这样?ignite中分配的默认堆内存为21 GB。我也没有做任何GC调优。