【问题标题】:How can I fix 'No space left on device' error in Docker?如何修复 Docker 中的“设备上没有剩余空间”错误?
【发布时间】:2021-07-05 16:24:40
【问题描述】:

我正在运行 Mac 原生 Docker(没有 virtualbox/docker-machine)。

我有一个巨大的图像,里面有很多基础设施(Postgres 等)。 我已经运行了清理脚本来清除很多杂乱无章的东西——未使用的图像等等。

当我运行我的图像时,我收到如下错误:

could not create directory "/var/lib/postgresql/data/pg_xlog": No space left on device

在我的主机 Mac 上 /var 有 60% 的可用空间,通常我的磁盘有大量可用存储空间。

这是我需要增加一些 Docker 配置以提供更多资源吗?

来自 mount 内部 docker 的相关行:

none on / type aufs (rw,relatime,si=5b19fc7476f7db86,dio,dirperm1)
/dev/vda1 on /data type ext4 (rw,relatime,data=ordered)
/dev/vda1 on /etc/resolv.conf type ext4 (rw,relatime,data=ordered)
/dev/vda1 on /etc/hostname type ext4 (rw,relatime,data=ordered)
/dev/vda1 on /etc/hosts type ext4 (rw,relatime,data=ordered)
/dev/vda1 on /var/lib/postgresql/data type ext4 (rw,relatime,data=ordered)

这里是df

[11:14]  
Filesystem     1K-blocks    Used Available Use% Mounted on
none           202054928 4333016 187269304   3% /
tmpfs            1022788       0   1022788   0% /dev
tmpfs            1022788       0   1022788   0% /sys/fs/cgroup
/dev/vda1      202054928 4333016 187269304   3% /data
shm                65536       4     65532   1% /dev/shm
tmpfs             204560     284    204276   1% /run/docker.sock

【问题讨论】:

  • 如果您在 Docker 实例中以 root 身份运行 mountdf,您会看到什么? (将其添加到问题中)- 还为我们提供运行容器的 docker inspect 输出的相关部分。
  • 好的,有趣的是你已经将/dev/vda1 挂载为/var/lib/postgresql/data(以及/data )。但它与/ 具有完全相同的可用空间,因此在封面下的容量可能相同,而且在您运行df 时它还远未满。我服从 Docker 之神。 docker inspect 可能会透露更多信息。
  • 默认情况下,容器会获得 10GB 的空间,这可能是你遇到的墙。暂时没时间多看,不过相信大家可以加分,看看docs.docker.com/engine/userguide/storagedriver/…

标签: docker


【解决方案1】:

我没有找到很多选项,github中的主要问题是https://github.com/docker/for-mac/issues/371

建议的一些选项有:

  • 如果您可以删除所有图像/容器,则可以按照以下说明操作:

docker rm $(docker ps -a -q) docker rmi $(docker images -q) docker volume rm $(docker volume ls |awk '{print $2}') rm -rf ~/Library/Containers/com.docker.docker/Data/*

  • 您可以尝试修剪所有未使用的图像/容器,但这已被证明不是很有效:

docker system prune

另见:How do you get around the size limitation of Docker.qcow2 in the Docker for Mac? 还有https://forums.docker.com/t/no-space-left-on-device-error/10894/26

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,运行 docker system prune --volumes 解决了这个问题。

    “默认情况下不修剪卷,您必须为 docker system prune 指定 --volumes 标志才能修剪卷。”

    见:https://docs.docker.com/config/pruning/#prune-everything

    【讨论】:

    • 在此之后我需要在没有--volumes 的情况下运行一个额外的docker system prune
    【解决方案3】:

    我最近在使用 devicemapper 存储驱动程序(默认)的 linux 上安装 docker 时遇到了这个问题。我确实需要更改一个 docker 配置来解决这个问题。

    Docker 映像由文件系统快照的只读层组成,每一层都由您的 Dockerfile 中的命令创建,它们构建在公共基础存储快照之上。基本快照由您的所有图像共享,并具有默认大小为 10GB 的文件系统。当你运行你的镜像时,你会在镜像的所有层之上获得一个新的可写层,因此你可以在运行的容器中添加新文件,但它最终仍然基于具有 10GB 文件系统的相同基本快照。 devicemapper 至少是这样,不确定其他驱动程序。 Here 是来自 docker 的相关文档。

    要将此默认值更改为其他值,您可以设置一个守护程序参数,例如docker daemon --storage-opt dm.basesize=100G。由于您可能不手动运行守护程序,因此需要在某些文件中编辑 docker 守护程序选项,具体取决于您运行 docker 守护程序的方式。使用 docker for mac,您可以在Daemon->Advanced 下的首选项中将守护程序参数编辑为 JSON。您可能需要添加如下内容:

    {
        "storage-opts": ["dm.basesize=100G"]
    }
    

    (但就像我说的,我在 linux 上遇到了这个问题,所以没有尝试上述方法)。

    无论如何,为了使其生效,您需要删除所有现有图像(以便在具有新大小的新基本快照之上重新创建它们)。见storage driver options

    【讨论】:

    • 请注意,这仅适用于 devicemapper,OSX 不使用它:github.com/docker/for-mac/issues/2134
    • 感谢您分享此内容。我在使用docker load 导入大图像时遇到了这种情况,但我在目标设备上至少有 4 倍的存储空间。为了完整起见,here 是 docker 文档,用于在 linux 上定位 JSON 配置文件(通常为 /etc/docker/daemon.json)。更改文件后不要忘记重新启动 docker 守护进程(例如sudo service docker restart)。
    猜你喜欢
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多