如何以相对较小的磁盘空间消耗构建大型docker映像?
背景 我正在尝试从虚拟机上的Dockerfile构建docker映像。VM运行的是Redhat7.1(内核3.10),Docker运行的是1.10.2 Dockerfile包含以下内容如何以相对较小的磁盘空间消耗构建大型docker映像?,docker,dockerfile,docker-build,Docker,Dockerfile,Docker Build,背景 我正在尝试从虚拟机上的Dockerfile构建docker映像。VM运行的是Redhat7.1(内核3.10),Docker运行的是1.10.2 Dockerfile包含以下内容 FROM rhel MAINTAINER MyName<me@email.com> RUN #yum install wget and other tools (less than 500 MB) COPY entitlementfile /opt/entitlementfile RUN wget
FROM rhel
MAINTAINER MyName<me@email.com>
RUN #yum install wget and other tools (less than 500 MB)
COPY entitlementfile /opt/entitlementfile
RUN wget -O /opt/installer.bin https://installer.com/installer.bin \
&& chmod +x /opt/* \
&& /opt/installer.bin --quiet \
&& rm -f /opt/*.bin
USER admin
安装程序大约为3G,安装的软件包大约为8G。这加起来最大为11G,略微超过docker默认的基本设备大小(10G)
因此,我手动使用更大dm.size(15G)的docker守护进程来解决这个问题
docker daemon --storage-opt dm.basesize=15G
因为docker是基于Union FS的,所以图像是层叠在一起的。
所以我的理解是
(1) 我的图像可以得到的最大尺寸是11G(安装在一层3G中,包层添加在顶部8G中)
(2) 如果我设置安装程序,运行它,然后在同一个run命令中删除安装程序,图像应该只有8G(因为3G安装程序被删除)
无论如何,底线是,16G的空间应该足够了
问题
但我目前的观察是,在我的docker构建过程中,
它将始终挂起,因为它已占用所有可用空间
[root@xrh701 DockerImage]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 18G 18G 20K 100% /
...
我可以看到两幅图像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> fa09e98656ba About an hour ago 258.1 MB
rhel latest 32f8a1d5f019 9 days ago 203.2 MB
此中间容器已完成运行wget行,已成功退出,但由于空间不足,未提交docker映像
更糟糕的是,我无法删除容器,也无法删除/var/lib/docker来恢复空间
# docker rm -f lonely_curie
Failed to remove container (lonely_curie): Error response from daemon: Driver devicemapper failed to remove root filesystem 232245023f90b42a4dbd19a78bf32836f9f8618d7dbcba54159c3df029b5b114: mount still active
问题
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_01-lv_root 59G 6G 53G 9% /
...
安装完成后
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_01-lv_root 59G 19G 38G 34% /
...
提交图像后
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_01-lv_root 59G 27G 30G 48% /
...
因此,回答我自己的问题:
(1) 它耗尽了所有磁盘,因为它至少需要那么多磁盘空间。之前的计算假设正在运行的容器和要构建的图像将共享同一层
(2) 我还没弄明白这部分。现在,我只是扔掉虚拟机,让它回收
(3) 所需的最小磁盘数为(3G+8G)*2=22g。因此,我想作为将来的参考,我应该保留理论计算的图像大小的两倍,因为在将运行的容器提交到图像时,层似乎是复制的,而不是共享的。[构建Dockerfile与手动运行容器并提交到映像基本相同。]
=================================================================
跑步
接下来,在我提交映像并删除容器后,可以回收磁盘
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_01-lv_root 59G 15G 42G 26% /
....
从那时起,启动一个正在运行的容器不会显著增加磁盘消耗
嗯,看来《孤独的居里》被删除了,因为我在《docker ps-a》中再也看不到它了。。。但我仍然无法删除/var/lib/docker,因为它仍然抱怨设备和资源繁忙
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_01-lv_root 59G 27G 30G 48% /
...
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_01-lv_root 59G 15G 42G 26% /
....
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_01-lv_root 59G 15G 42G 26% /
...