我现在正在使用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 installWORKDIR / 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磁盘?
答案 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
中找到详细信息