如何在Docker中修复"设备上没有空间"错误?

Gre*_*reg 11 docker

我正在运行Mac原生Docker(没有虚拟机/码头机).

我有一个巨大的形象,其中有很多基础设施(Postgres等).我已经运行了清理脚本来摆脱许多残骸 - 未使用的图像等等.

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

could not create directory "/var/lib/postgresql/data/pg_xlog": No space left on device
Run Code Online (Sandbox Code Playgroud)

在我的主机上Mac/var占用60%的可用空间,通常我的磁盘有很多存储空间.

这是一些Docker配置,我需要提高它给它更多的资源?

来自mountdocker内部的相关行:

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)
Run Code Online (Sandbox Code Playgroud)

这是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
Run Code Online (Sandbox Code Playgroud)

Kha*_*321 35

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

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

请参阅: https: //docs.docker.com/config/pruning/#prune-everything


pca*_*bra 12

我没有为此找到很多选择,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

另请参阅:如何解决Mac版Docker中Docker.qcow2的大小限制?https://forums.docker.com/t/no-space-left-on-device-error/10894/26


avi*_*ivr 7

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

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

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

{
    "storage-opts": ["dm.basesize=100G"]
}
Run Code Online (Sandbox Code Playgroud)

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

无论如何,为了使其生效,您需要删除所有现有图像(以便在具有新大小的新基本快照之上重新创建它们)。请参阅存储驱动程序选项

  • 请注意,这仅适用于 devicemapper,OSX 不使用它:https://github.com/docker/for-mac/issues/2134 (3认同)