背景
我正在尝试从 VM 上的 Dockerfile 构建 docker 映像。VM 正在运行 Redhat 7.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 -O /opt/installer.bin https://installer.com/installer.bin \
&& chmod +x /opt/* \
&& /opt/installer.bin --quiet \
&& rm -f /opt/*.bin
USER admin
我的构建 VM 有大约16G可用空间
[root@xrh701 DockerImage]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 18G 2.1G 16G 12% /
...
安装程序在3G左右,安装包在8G左右。这加起来最大为 11G,略高于 docker 默认的基本设备大小,即 10G。
因此,我手动启动了具有更大 dm.size ( 15G ) 的 docker daemon 来解决这个问题。
docker daemon --storage-opt dm.basesize=15G
由于 docker 是基于 Union FS 的,所以图像是相互叠加的。所以我的理解是
(1)我的镜像能得到的最大大小是11G(一层3G的Installer,上面加的包层8G)
(2)如果我wget安装程序,运行它,然后在同一个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
“docker inspect”显示<none>镜像是COPY授权文件后的中间镜像。
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
232245023f90 fa09e98656ba "/bin/sh -c 'wget -O " About an hour ago Exited (0) About an hour ago lonely_curie
这个中间容器已经完成了 RUN 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
问题
为什么 docker 用完了所有的空间?根据计算,磁盘空间(16G)对于目标镜像(8G)应该是绰绰有余的。[我拥有这台虚拟机,因此我可以保证没有其他人或任何其他进程正在消耗硬盘空间]
在当前情况下,如何强制移除容器以便恢复空间?
我应该如何在 16G 虚拟机上构建这个 8G 映像(如果算上安装程序,则为 11G 映像)?如果这不可能,成功构建它的最小空间是多少?我目前正在从实验室申请一个 32G 的 VM。