Docker/OSX 找不到“设备上没有剩余空间”的原因

Docker/OSX 找不到“设备上没有剩余空间”的原因

环境版本:

macos 10.14.4
docker server 18.09.2
docker desktop Version 2.0.0.3 (31259)

面临no space left on device容器内部的错误,无法确定溢出来自何处。

最糟糕的是,我无法从母主机系统的角度确定实际的容器大小(info/inpsect/system df 工具),事实上来自 docker 和母主机的统计数据并不相等 :/

我有一个容器,里面有以下 df 统计数据:

   root@31a71014ad95:/usr/local/app# df -h
   Filesystem      Size  Used Avail Use% Mounted on
   overlay          63G   21G   40G  34% /
   tmpfs            64M     0   64M   0% /dev
   tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
   osxfs           234G  182G   48G  80% /shared_from_host
   /dev/sda1        63G   21G   40G  34% /etc/hosts
   shm              64M     0   64M   0% /dev/shm
   tmpfs           2.0G     0  2.0G   0% /proc/acpi
   tmpfs           2.0G     0  2.0G   0% /sys/firmware

shared_from_host- 是与母主机交互的共享卷)

值得一提的是,我读过有关 macos 上的一般图像文件大小的文章,它看起来还可以,而且远离默认的 64Gb 大小:

ls -lah ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2
-rw-r--r--@ 1 coin  staff    21G May 26 22:25 /Users/usss/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2

Docker 容器肯定包含一个很大的子目录:

root@31a71014ad95:/usr/local/app# du -hs ./*|grep CRISP
12G     ./CRISPRCasFinder

我看到ps -sinspectsystem df作为估计容器磁盘使用情况统计数据的推荐方法,但没有成功。它们都显示非实际值。所以看来我以错误的方式使用这些工具,我以错误的方式解释数字。

从母宿主来看,统计数据如下:

  1. docker inspect给出https://pastebin.com/53vLji1p

  2. docker ps -s给出

%docker container ps -sa
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS                        PORTS                      NAMES               SIZE
31a71014ad95        nvm:nvm_tag   "/bin/bash"              6 hours ago         Exited (137) 23 minutes ago                              cr                  3.52GB (virtual 5.44GB)
<...>
  1. docker system df给出
%docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              8                   6                   5.52GB              3.021GB (54%)
Containers          6                   0                   3.541GB             3.541GB (100%)
Local Volumes       33                  6                   2.751GB             2.381GB (86%)
Build Cache         0                   0                   0B                  0B

这些值都不像 du 的容器使用情况(如上所示)。这些值是我应该寻找的东西吗?

我发现最有用、最详细的例子是https://www.projectatomic.io/blog/2016/03/daemon_option_basedevicesize/

但是,似乎在我当前的docker版本输出中不再包含作者用于说明的字段-没有“基本设备大小”,没有“DeviceSize”

所以问题是:

  1. 我如何才能看到真实的容器使用情况统计数据,以便我可以进行一些调整。

  2. 最大容器磁盘大小的配置放在哪里?

谢谢你!

更新

我尝试重新启动 docker 应用程序,但最终出现了致命的空间错误 -https://pastebin.com/twM3qN8N

所以 docker 目前根本无法启动。好吧...我在 gh 上也发现了类似的问题 -https://github.com/docker/for-mac/issues/3529

我之前看到过一些关于错误行为的问题,删除 qcow2 文件可以解决问题,但总是存在空间问题,used大小configured接近,问题出在调整大小上。但这个问题似乎与我的问题类似,因为问题作者的 qcow2 文件大小似乎足够大。

我看到临时的解决方法是清除所有数据,但希望在进行强制清除之前找到替代方案,或者至少找到有关磁盘使用情况指标的某种解释。

更新2

部分决策未明确,但没有理解

继续阅读各种文章,阅读后http://phutchins.com/blog/2017/01/04/fixing-docker-no-space-left-on-device/

注意到奇怪的 20Gb 限制,这是 2017 年的默认限制。然后思考了一下。让我们想象一下,尽管df -h容器内部和docker desktopUI 设置报告了 64Gb,但我仍然有 20Gb 的限制。看起来可能吗?

并安装 qemu 并向图像中添加 +5Gb,如文章中所述:

%qemu-img resize ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2 +5G

瞧,一切已启动并运行。我仍然看到 qemu 文件的大小相同:

%ls -lah ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2
-rw-r--r--@ 1 usss  staff    21G May 27 00:46 /Users/usss/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2

但从容器的角度来看用法发生了一些变化

root@31a71014ad95:/usr/local/app# df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay          68G   21G   45G  32% /
tmpfs            64M     0   64M   0% /dev
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
osxfs           234G  178G   55G  77% /shared_from_host
/dev/sda1        68G   21G   45G  32% /etc/hosts
shm              64M     0   64M   0% /dev/shm
tmpfs           2.0G     0  2.0G   0% /proc/acpi
tmpfs           2.0G     0  2.0G   0% /sys/firmware

现在声明可使用45Gb(上面有40Gb)。

但至少现在一切都正常了,但完全不了解shadowed消耗隐藏在哪里。

答案1

桌面版 docker 的磁盘空间可能受您提供给嵌入式 docker VM 的磁盘限制。此 VM 内部是图像、容器、命名卷以及未从外部源(例如 MacOS 上的 /Users 目录)明确安装到 VM 中的任何其他文件。您可以从 docker 首选项中调整此 VM 的设置:

Docker for MacOS 磁盘偏好设置

图片来源:docker 文档

更多详细信息请访问:https://docs.docker.com/docker-for-mac/space/


关于磁盘使用情况,有一点需要注意,磁盘字节数可能会用尽,inode 也可能会用尽。两者都会给出相同的错误。使用选项df -i检查 indoes,例如:

df -h # to see disk free
df -hi # to see inodes free

如果在容器运行时发生错误,然后删除容器,则删除容器可能会释放磁盘空间。

相关内容