如何释放以前在Docker映像中使用过但以后会删除的空间

时间:2019-02-28 09:39:36

标签: docker dockerfile

我现在正在使用Dockerfile构建docker映像。

我下载了cmake和gcc源代码,进行安装:

  

WORKDIR / root / source

     

运行wget   https://github.com/Kitware/CMake/releases/download/v3.12.4/cmake-3.12.4.tar.gz   && tar xf cmake-3.12.4.tar.gz-删除文件

     

运行git clone https://github.com/gcc-mirror/gcc.git -b gcc-6-branch   -单分支

     

运行cd gcc && ./configure --prefix = / usr --disable-multilib && make -j nproc && make install

     

运行cd cmake-3.12.4 && ./configure && gmake -j nproc && make install

     

WORKDIR / root

现在我的docker映像大小为11G,但是源代码使用8G。所以我认为源代码对我没有用,因为我有make install,因此如果我拥有源文件,则图像大小可以是3G?

这是我的文件系统大小:

[root@a8df8af9539e source]# du / -hl --max-depth=1
4.0K    /lost+found
2.1G    /usr
4.0K    /media
107M    /var
28K     /tmp
0       /sys
4.0K    /srv
4.0K    /home
9.9M    /etc
7.9G    /root
0       /proc
4.0K    /opt
4.0K    /mnt
92K     /run
0       /dev
4.0K    /boot
11G     /

我认为是。

然后我在Dockerfile的末尾添加RUN rm -rf /root/source并重建此docker镜像,但是镜像大小也为11G。还要列出我的文件系统大小:

[root@2a642ce974da ~]# du / -hl --max-depth=1
4.0K    /lost+found
2.4G    /usr
4.0K    /media
78M     /var
28K     /tmp
0       /sys
4.0K    /srv
4.0K    /home
12M     /etc
100K    /root
0       /proc
4.0K    /opt
4.0K    /mnt
100K    /run
0       /dev
4.0K    /boot
2.5G    /

为什么?我的空间在哪里,如何释放8G磁盘?

2 个答案:

答案 0 :(得分:2)

您添加到Dockerfile中的每个RUN语句都会创建一个新层,最后将所有层合并(不直接合并,有一些规则)以构建最终映像。即使您在上层更改/删除某些文件,它也不会从下层删除文件,只是以某种方式将其阴影。

这是一个示例Dockerfile:

FROM baseimage
RUN wget -O file http://...
RUN rm file

为简单起见,baseimage为100 MB,file为80 MB的映像,为此构建创建了三层。第一层是100MB,第二层是80MB,最后一层只有一些元数据,表示第二层的文件已删除。因此,即使您在最后一层删除了80 MB,生成的图像也只有180 MB(由三层组成)。

但是,如果在同一层上进行安装和拆卸,则会看到不同之处:

FROM baseimage
RUN wget -O file http://... && rm file

现在您的第一层是100 MB,第二层是〜0 MB(因为您在同一RUN语句中删除了文件),并且您的图像是100 MB。

简而言之,您应该在相同的RUN语句中进行安装和删除。

答案 1 :(得分:1)

我认为多阶段构建可以为您提供帮助,因为在第一阶段您可以构建代码,然后在下一阶段运行它。

# Stage 1: Build code
FROM <your image> as builder 
RUN <your build instructions>

# Stage 2: Run code
FROM <your image>  
# Copy artifacts from 'builder' stage 
COPY --from=builder <src folder from builder> <target folder>
# Run your code
CMD [...]

您可以在documentation

中找到详细信息