首页 > 解决方案 > Docker(Linux)错误:即使我有足够的空间,设备上也没有剩余空间

问题描述

我已经构建了 docker 映像,而我得到了Error: no space left on device。这出现在 docker 复制 oracle 数据库文件的步骤中。在我的 docker 文件中是这一步:

ADD resources/oracle/database /data/home/oracle/database/
RUN chown -R oracle:oracle /data/home/oracle/database

当我构建图像之后,此步骤需要一些时间,然后它会打印此错误:

Step 10/32 : ADD resources/tomcat/apache-tomcat-8.0.29.tar.gz /opt/tomcat
 ---> 092e001b744e
Step 11/32 : ADD resources/oracle/database /data/home/oracle/database/
 ---> 69218d6278b0
Step 12/32 : RUN chown -R oracle:oracle /data/home/oracle/database
 ---> Running in 4ae797185eeb
Error processing tar file(exit status 1): write /data/home/oracle/database/javavm/jdk/jdk8/admin/classes.bin: no space left on device

嗯,在我看来,我在 linux 服务器上没有足够的空间。然后我尝试检查我在 linux 中的空间,因为我确信我有很多空间。我运行 df -h 它看起来像这样:

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs         59G     0   59G   0% /dev
tmpfs            59G     0   59G   0% /dev/shm
tmpfs            59G  418M   59G   1% /run
tmpfs            59G     0   59G   0% /sys/fs/cgroup
/dev/sda3        39G   30G  9.0G  77% /
/dev/sda1       200M  8.6M  192M   5% /boot/efi
tmpfs            12G     0   12G   0% /run/user/1000
/dev/sdc       1008G  176G  781G  19% /data
/dev/sdd       1008G  466G  492G  49% /oracle
tmpfs            12G     0   12G   0% /run/user/2003

在我构建图像之前,它看起来像这样:

davinci@sii-dev-ora19:/opt/davinci]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs         59G     0   59G   0% /dev
tmpfs            59G     0   59G   0% /dev/shm
tmpfs            59G  418M   59G   1% /run
tmpfs            59G     0   59G   0% /sys/fs/cgroup
/dev/sda3        39G   16G   23G  42% /
/dev/sda1       200M  8.6M  192M   5% /boot/efi
tmpfs            12G     0   12G   0% /run/user/1000
/dev/sdc       1008G  176G  781G  19% /data
/dev/sdd       1008G  466G  492G  49% /oracle
tmpfs            12G     0   12G   0% /run/user/2003

意味着我在构建映像之前在 /dev/sda3 上有 23GB 可用,而在构建映像之后只有 9GB 可用。

问题1:为什么即使我在那个分区上还有 9GB 可用,它也会停止? 问题2: docker 似乎没有从其他分区中占用空间。例如,在 dev/sdc 上,我有 718GB 可用空间。如何告诉 docker 从那里占用空间? 问题3:似乎docker将文件写入这个文件夹/data/home/oracle/database/...但是我用winscp去那个文件夹我只能找到目录/data。容器中的文件夹 /data/home/oracle/database/ 是某种方式还是它真的在 linux 文件系统中?

标签: linuxdockerdockerfile

解决方案


问题1:为什么即使我在那个分区上还有 9GB 可用,它也会停止?

发生错误时您没有。该错误导致 docker 删除了它创建的部分文件系统层。注意覆盖文件系统,递归 chmod 将复制该目录树中的每个文件,使已用磁盘空间翻倍。

df -i请注意,当您收到此写入 ( )时,您还应该注意 inode 耗尽。

问题2: docker 似乎没有从其他分区中占用空间。例如,在 dev/sdc 上,我有 718GB 可用空间。如何告诉 docker 从那里占用空间?

Docker 将数据存储在/var/lib/docker. 我建议将其设为自己的分区,或者使用符号链接重新定位它,而不是尝试更改 docker 的位置。有很多工具假设这个目录名称。

问题3:似乎docker将文件写入这个文件夹/data/home/oracle/database/...但是我用winscp去那个文件夹我只能找到目录/data。容器中的文件夹 /data/home/oracle/database/ 是某种方式还是它真的在 linux 文件系统中?

Docker 使用命名空间,以及文件系统中的命名空间之一。docker 容器中的根目录不是主机上的根目录,否则您将没有隔离。这通常实现为 docker 目录下的覆盖文件系统,并且 Dockerfile 的每一步都可能创建一个新的文件系统层,供覆盖层使用。


推荐阅读