ChatGPT解决这个技术问题 Extra ChatGPT

Docker 错误:设备上没有剩余空间

我通过以下方式在 Debian 7 机器上安装了 docker

$ echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list
$ sudo apt-get update
$ curl -sSL https://get.docker.com/ubuntu/ | sudo sh

之后,当我第一次尝试创建图像时,它失败并出现以下错误

 time="2015-06-02T14:26:37-04:00" level=info msg="[8] System error: write /sys/fs/cgroup/docker/01f5670fbee1f6687f58f3a943b1e1bdaec2630197fa4da1b19cc3db7e3d3883/cgroup.procs: no space left on device"

这是码头工人信息

Containers: 2
Images: 21
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 25
Dirperm1 Supported: true
Execution Driver: native-0.2
Kernel Version: 3.16.0-0.bpo.4-amd64
Operating System: Debian GNU/Linux 7 (wheezy)
CPUs: 2
 Total Memory: 15.7 GiB


WARNING: No memory limit support
 WARNING: No swap limit support

我怎样才能增加内存?系统配置存储在哪里?

来自 Kal 的建议:

当我摆脱所有图像和容器时,它确实释放了一些空间,并且图像构建运行时间更长,然后失败并出现相同的错误。那么问题来了,这指的是哪个空间,我该如何配置呢?

有时,您可以点击 per-container size limit,具体取决于您的存储后端。该链接显示了如何为 devicemapper 修复它。
当我的磁盘没有 inode 时出现此错误。检查df -ih
@KevinSmyth 非常感谢您指出这一点。在此之前,我什至不知道 inode 限制的重要性。
我发现这个答案对我有帮助 (stackoverflow.com/a/67759303/10869929)

J
Joshua Cook

当前的最佳做法是:

docker system prune

在接受后果之前,请注意此命令的输出:

WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - all dangling build cache

Are you sure you want to continue? [y/N]

换句话说,继续执行此命令是永久性的。请记住,最佳实践是处理 stopped containers as ephemeral,即您应该使用 Docker 设计您的工作,以不保留这些停止的容器。如果您不主动调试容器,您可能需要考虑在运行时使用 --rm flag

请务必阅读 this answer,re: Volumes

如果 docker system prune 不适合您,您可能也对 this answer 感兴趣。


正如 Kevin Smyth 指出的那样,此错误可能是由于您用 df -ih 看到的 inode 用完了。要进行更严格的诊断,请输入 ncdu,然后按 c 来查看文件计数,然后按 C 来按文件数量排序,以粗略估计正在使用所有 inode 的内容。如果问题确实是 docker,那么使用最多 inode 的目录会立即显现出来。
真的,这应该被投票并给出答案,因为它是正确的方法。建筑环境被污染了,现在在这里和那里可能会暂时修复它,但正确的方法应该是docker system prune
@zhrist 哈哈我同意
@coler-j 也许......如果您正在考虑最初的高度具体的问题。但是,让我们彼此诚实。大多数人发现这个问题并不是因为 OP 的用例晦涩难懂,而是因为他们的 docker 缓存空间不足。
请注意,随着时间的推移,非悬空图像会占用大量空间。在上述优秀答案之后,根据需要检查docker imagesdocker rmi
j
jpaugh

我有同样的错误并以这种方式解决:

1.删除 Docker 中的孤立卷,可以使用内置的 docker volume 命令。内置命令还会删除 /var/lib/docker/volumes 中不是卷的任何目录,因此请确保您没有在其中放置任何要保存的内容。

警告如果您有一些要保留的数据,请务必小心

清理:

$ docker volume rm $(docker volume ls -qf dangling=true)

附加命令:

列出悬空卷:

$ docker volume ls -qf dangling=true

列出所有卷:

$ docker volume ls

2.还可以考虑删除所有未使用的图像。

首先删除 <none> 图像(这些图像有时会在构建图像时生成,如果由于某种原因图像构建被中断,它们会保留在那里)。

这是我用来删除它们的好脚本

docker rmi $(docker images | grep '^<none>' | awk '{print $3}')

然后,如果您使用 Docker Compose 为每个项目在本地构建图像。您最终会得到很多通常以您的文件夹命名的图像(例如,如果您的项目文件夹名为 Hello,您将找到图像名称 Hello_blablabla)。所以也考虑删除所有这些图像

您可以编辑上述脚本以删除它们或手动删除它们

docker rmi {image-name}


请注意:Mac 上的 awk 命令必须用单引号括起来,而不是双引号,否则它会被忽略。
我在 MAC 上,它对我有用!!但感谢您的建议。
多么奇怪!它对我不起作用。只是打印出与 grep 相同的结果。呃,好吧。奇怪的事情发生了。
此时,您可以对图像使用相同的过滤器。 docker images -qf dangling=true,当然也可以使用 docker rmi $(docker images -qf dangling=true) 删除它们。
我收到一个错误:“docker volume rm”至少需要 1 个参数。
K
Kal

检查 /var 上是否有可用空间,因为这是 Docker 默认存储图像文件的位置(在 /var/lib/docker 中)。

首先通过使用 docker ps -a 列出所有容器(包括停止的容器)和 docker rm 来清除它们;然后使用 docker images 列出您存储的所有图像并使用 docker rmi 删除它们。

接下来使用 docker 守护程序上的 -g 选项或通过编辑 /etc/default/docker 并将 -g 选项添加到 DOCKER_OPTS 来更改存储位置。 -g 指定“Docker 运行时”的位置,它基本上是 Docker 在您构建映像和运行容器时创建的所有内容。选择一个有足够空间的位置,因为使用的磁盘空间会随着时间的推移而增长。如果您编辑 /etc/default/docker,则需要重新启动 docker 守护程序才能使更改生效。

现在您应该能够创建一个新映像(或从 Docker Hub 中提取一个),并且您应该看到在您使用 -g 选项指定的目录中创建了一堆文件。


谢谢 Kal,我找不到关于 DOCKER_OPTS 的文档。 -g 选项是什么意思,应该设置什么? docker/aufs/mnt 下的东西也可以删除吗?
嘿 ruby,我想我从来没有找到过关于 DOCKER_OPTS 的真实文档,但是文档中到处都有讨论编辑它的地方。我能找到的最接近的是在 docs.docker.com/installation/ubuntulinux/… 的末尾,它谈到了在 DOCKER_OPTS 中编辑 DNS 设置。 DOCKER_OPTS 中的选项只是传递给守护程序,所以它的引用是 docs.docker.com/reference/commandline/cli/#daemon。 -g 设置“Docker 运行时”的基本位置
docker/aufs/mnt 下的东西也可以删除吗?
不要手动删除那些东西。而是删除您不需要的任何容器(包括退出的容器)和图像。您应该在更改 -g 选项之前执行此操作。使用 docker ps -a 列出所有容器(包括退出的容器),然后使用 docker rm 删除它们。使用 docker images 列出所有图像,然后使用 docker rmi 删除它们。希望这应该清理所有东西(或大多数东西)。
谢谢,所以清除图像和容器会腾出一些空间。但是更新的图像仍然需要更多。但是 docker 运行时应该指向什么?有没有办法增加 docker 用于存储图像的空间?
R
RoBeaToZ

如前所述,

docker system prune

有帮助,但对于 Docker 17.06.1 及更高版本,无需修剪未使用的卷。从 Docker 17.06.1 开始,以下命令也会修剪卷:

docker system prune --volumes

来自 Docker 文档:https://docs.docker.com/config/pruning/

docker system prune 命令是修剪镜像、容器和网络的快捷方式。在 Docker 17.06.0 及更早版本中,卷也会被修剪。在 Docker 17.06.1 及更高版本中,您必须为 docker system prune 指定 --volumes 标志以修剪卷。

如果要修剪卷并保留图像和容器:

docker volume prune

docker volume prune 今天在这里所有其他解决方案都停止工作时帮助了我。
巨大的帮助 - 除了修复错误之外,这还释放了我硬盘上的许多空间。
docker system prune --volumes 对我有用,但我必须先手动停止并删除所有容器。否则 prune 命令挂起,无法删除卷。也许我有一个反应迟钝的容器。
docker system prune --all --volumes帮助了我
G
Guillaume

一次删除所有未使用的容器、卷、网络和图像 (https://docs.docker.com/engine/reference/commandline/system_prune/):

docker system prune -a -f --volumes

如果还不够,可以先删除正在运行的容器:

docker rm -f $(docker ps -a -q)
docker system prune -a -f --volumes

增加 /var/lib/docker 或使用具有更多空间的其他位置也是消除此错误的好方法(请参阅 How to change the docker image installation directory?


docker system prune 不删除卷。
docker system prune -a -f --volumes 将删除卷。
docker system prune -af --volumes 将清除之前创建的所有 docker 资源。
到底是什么鬼。 docker system prune 删除了大约 7GB 的内容。 docker system prune --volumes 增加了 4GB 左右,然后 docker system prune -a -f --volumes 删除了 575.5GB 的内容。笏。这是磁盘内容分析器无法捕获的所有空间。这个答案应该更高。 -a-f 标志可以产生巨大的差异。
d
davnicwil

Docker for Mac

因此,在其他答案中建议的 docker system prunedocker system prune --volumes 每次都释放了 一些 空间,但最终每次我运行任何东西时都会遇到错误。

真正解决了根本问题的是删除 Docker for Mac 用于存储的 Docker.raw 文件,然后重新启动它。

要找到该文件,请打开 Docker for Mac 并转到*

Preferences > Resources > Advanced > Disk Image Location

*这是针对版本 2.2.0.5,但在旧版本上应该类似

在较新版本的 Docker for Mac** 上,它会在 UI 中向您显示磁盘上该文件的实际大小,以及它的最大分配大小。你可能会看到它是巨大的。例如在我的机器上是 41GB!

**在旧版本上,它不会在 UI 中向您显示实际的磁盘使用情况,并且 MacOS Finder 始终将文件大小显示为最大分配大小。您可以通过在终端中打开目录并运行 du -h Docker.raw 来检查磁盘上的实际大小

我删除了 Docker.raw,重新启动了 Docker for Mac,文件再次自动创建并恢复为 0GB

一切都像以前一样继续工作,虽然我当然丢失了我的 Docker 缓存。正如预期的那样,在运行了一些 Docker 命令之后,文件又开始被几 GB 的东西填满,但远不及 41GB。

更新

几个月后,我的 Docker.raw 再次填充到类似大小。所以这种方法确实有效,但必须每隔几个月重复一次。对我来说这很好。

关于这个工作原理的说明 - 我必须假设这是 Docker for Mac 中的一个错误。看起来 docker system prune / docker system prune --volumes 应该完全清除此文件的内容,但似乎该文件累积了这些命令无法删除的其他内容。无论如何,手动删除它可以解决问题!


我收到一个套接字错误,说守护程序无法连接。我不得不转移到别的东西上,但是当我今天再次检查它时,它正在工作。无视上面的评论,对不起。
谢谢你!这在 Mac Mojave 10.14.6 上对我有用。删除系统、图像、卷等的所有其他命令都清理了一些空间,但不允许我构建,这终于奏效了
路径:/Users/<your-username>/Library/Containers/com.docker.docker/Data/vms/0/Docker.raw
从我所见,docker system prune 减小了这个文件的大小。
d
deizel.

如果它只是 Docker 的测试安装(即不是生产)并且您不关心进行核清洁,您可以:

清理所有容器:docker ps -a | sed '1 d' | awk '{print $1}' | xargs -L1 docker rm

清理所有图像:docker images -a | sed '1 d' | awk '{print $3}' | xargs -L1 docker rmi -f

同样,我在开发 Docker 时在我的 ec2 实例中使用它,而不是在任何严肃的 QA 或生产路径中。最棒的是,如果您拥有 Dockerfile,则很容易重建和或docker pull


在我的 boot2docker 实例中,我必须调用 docker images -a | sed '1 d' | awk '{print $3}' | xargs docker rmi -fxargs 的 OS X BSD 版本支持 -L 选项,这与 boot2docker 的版本不同。
您可以使用 docker ps -a -q 等来避免文本操作,即 docker rm $(docker ps -a -q); docker rmi -f $(docker images -a -q) 应该可以解决问题
k
kenorb

如果您使用的是 Docker Desktop,您可以通过转到 Docker 的首选项来增加高级设置中的磁盘映像大小。

这是来自 macOS 的屏幕截图:

https://i.stack.imgur.com/FvGEHl.png


这是迄今为止最好的选择,不是每次,我都想取消我的缓存,重新开始,尤其是我的网速很慢 😭。我有空间,所以让我利用我的磁盘。
我很惊讶这没有得到更多的支持。是的,Docker 占用了大量的磁盘空间,但如果你能负担得起使用 100 GB 的空间,那么就不要清除缓存!
M
Mayank Chaudhary

我也在 RHEL 机器上遇到了这个问题。我在 stack-overflow 和 docker-hub 社区的任何地方都没有找到任何合适的解决方案。如果您即使在执行以下命令后仍面临此问题:

docker system prune --all

最终奏效的解决方案:

docker info 要检查当前的 docker 存储驱动程序我的是:存储驱动程序:devicemapper;如果您有存储驱动程序作为 overlay2,则无需担心。解决方案仍然适用于您。 df -h 这是检查机器上可用的文件系统以及它们的挂载路径。两个挂载路径有备注: /dev/mapper/rootvg-var 7.6G 1.2G 6.1G 16% /var /dev/mapper/rootvg-apps 60G 9.2G 48G 17% /apps 注意-默认docker存储路径是/var/lib/docker.它有大约 6 GB 的可用空间,因此存在所有与空间相关的问题。所以基本上,我必须将默认存储移动到可用空间更多的其他存储。对我来说,它的文件系统路径“/dev/mapper/rootvg-apps”安装在/apps 上。现在的任务是将 /var/lib/docker 移动到 /apps/newdocker/docker 之类的位置。 mkdir /apps/newdocker/docker chmod -R 777 /apps/newdocker/docker 更新 linux 上的 docker.serive 文件,该文件位于: /usr/lib/systemd/system vi /usr/lib/systemd/system/docker.service if存储设备是 devicemapper ,注释现有的 ExecStart 行并在 [Service] 下添加: ExecStart= ExecStart=/usr/bin/dockerd -s devicemapper --storage-opt dm.fs=xfs --storage-opt dm.basesize=40GB -g /apps/newdocker/docker --exec-opt native.cgroupdriver=cgroupfs 或者如果存储设备是overlay2:只需在现有的ExexStart语句中添加-g /apps/newdocker/docker。类似 ExecStart=/usr/bin/dockerd -g /apps/newdocker/docker -H fd:// --containerd=/run/containerd/containerd.sock rm -rf /var/lib/docker (它将删除所有现有的 docker 数据)systemctl stop docker ps aux | grep -i 码头工人 | grep -v grep 如果上述命令没有产生输出,请通过以下命令重新加载 systemd 守护进程。 systemctl daemon-reload systemctl start docker docker info 查看可用数据空间:将 docker 挂载到新文件系统后 62.15GB。完毕


我一直在寻找有关如何实现这一目标的文档!谢谢你,先生。我们可以将此标记为答案之一吗?
我仍然无法将其链接到更大尺寸的新文件夹。
V
Velu

在我的例子中,我运行 docker system df 来找出哪个组件占用更多空间,然后我执行 docker system prune -a 来清理所有悬空的容器、图像等。最后,我运行 docker volume rm $(docker volume ls -qf dangling=true) 来清理悬垂的卷。

以下是按顺序执行的命令。

docker system df
docker system prune -a
docker volume rm $(docker volume ls -qf dangling=true)

直到 docker system df,谢谢!
f
flaxel

我去了码头设置并更改了可用的图像空间。使用 docker build 创建新映像时达到了限制。所以我只是增加了可用的数量。

https://i.stack.imgur.com/cgR9D.png


h
halfer

Docker 会留下悬空的图像,这些图像会占用你的空间。要在 Docker 之后进行清理,请运行以下命令:

docker image prune [-af if you want to force remove all images]

或者使用旧版本的 Docker:

docker rm $(docker ps -q -f 'status=exited')
docker rmi $(docker images -q -f "dangling=true")

这将删除退出的和悬空的图像,这有望清除设备空间。


在我首先使用 minikube ssh SSH 连接到 VM 之后,docker image prune -a 为我使用了运行我的 docker 容器的 minikube。 docker 镜像在我的虚拟机中占用了 8GB。
J
Jørgen

就我而言,我没有那么多图像/容器,但构建缓存正在填满我的 Docker 磁盘。

您可以通过运行看到这是问题所在

docker system df

输出:

TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              22                  13                  7.581GB             3.899GB (51%)
Containers          15                  0                   2.166GB             2.166GB (100%)
Local Volumes       4                   4                   550.2MB             0B (0%)
Build Cache         611                 0                   43.83GB             43.83GB!!!!!!!!!

下面的命令解决了这个问题

docker builder prune

一个真正伟大的答案。删除构建无助于清理磁盘空间。 docker builder prune 删除构建的所有未使用缓存
x
xarlymg89

清理悬空图像 docker rmi $(docker images -f "dangling=true" -q) 删除不需要的卷 删除未使用的图像 删除未使用的容器


对我来说,问题是图像太多。清理它们后,docker 再次工作。
R
Rogerson Nazário

1. 移除容器:

$ docker rm $(docker ps -aq)

2. 删除图像:

$ docker rmi $(docker images -q)

您可以执行以下操作,而不是执行步骤 1 和 2:

docker system prune

此命令将删除:

所有停止的容器

至少一个容器未使用的所有卷

至少一个容器未使用的所有网络

所有悬空图像


a
alexanoid

您还可以使用:

docker system prune

或仅卷:

docker volume prune

--volumes 添加到 docker system prune,它将组合在一起
L
Lais Gabrielle Lodi

如果您已经清理了未使用的容器,则使用

docker system prune -a

确保检查您是否有不健康的容器。他们可以以一种奇怪且不可预测的方式行事。在我的情况下,因为这些,我得到了这个错误,甚至有大量的磁盘空间。

docker ps -a 将列出所有容器。如果其中任何一个看起来像这样:

CONTAINER ID   IMAGE          COMMAND   CREATED          STATUS                     PORTS           NAMES
4c01db0b339c   ubuntu:12.04   bash      17 seconds ago   Up 16 seconds (unhealthy)  3300-3310/tcp   webapp

您将需要重新启动 docker 守护程序。


K
Kostyantyn

在我的情况下,安装 ubuntu-server 18.04.1 [出于某种奇怪的原因] 创建了一个大小仅为 4GB 而不是 750GB 的 LVM 逻辑卷。因此,在拉取图像时,我会收到“设备上没有剩余空间”错误。修复很简单:

lvextend -l 100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv
resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv

.. 在以下线程中查看我对 resize2fs 的分步说明:stackoverflow.com/questions/32485723/…
h
halfer

使用以下命令清理 Docker:

docker images --no-trunc | grep '<none>' | awk '{ print $3 }' \
| xargs docker rmi

B
Bhargav Tavethiya

不要只运行 docker prune 命令。它将删除所有 docker 网络、容器和图像。因此,您最终也可能会丢失重要数据。

错误显示“设备上没有剩余空间”,所以我们只需要释放一些空间。

释放一些空间的最简单方法是删除悬空图像。

当不使用旧创建的图像时,这些图像被称为悬空图像,或者还有一些缓存图像可以删除。

使用以下命令。列出所有悬空图像的图像 ID。

docker images -f "dangling=true" -q

按图像 ID 删除图像。

docker rmi IMAGE_ID

这样您就可以腾出一些空间并再次开始使用 docker 进行黑客攻击 :)


运行此命令将遍历 dangling=true 命令的所有结果:docker images -f "dangling=true" -q | xargs -I {} docker rmi {}
更简单的是docker images -f "dangling=true" -q | xargs docker rmi
X
Xiao

您的 cgroup 启用了 cpuset 控制器。该控制器在 NUMA 环境中最有用,它允许精细指定允许您的任务运行的 CPU/内存组。

默认情况下,未设置强制 cpuset.memscpuset.cpus,这意味着您的任务“没有剩余空间”,因此出现错误。

解决此问题的最简单方法是在根 cgroup 中将 cgroup.clone_children 启用为 1。在你的情况下,它应该是

echo 1 > /sys/fs/cgroup/docker/cgroup.clone_children

它基本上会指示系统从其父 cgroup 自动初始化容器的 cpuset.memscpuset.cpus


这是正确的答案。真正简单地将 Docker 升级到任何东西>= Docker 1.8 应该 解决它。这与github.com/opencontainers/runc/issues/133有关,从该问题来看,另一种可能的解决方法是“echo 0 > /sys/fs/cgroup/cpuset/system.slice/cpuset.mems
A
Abbas Gadhia

如果您通过 Docker Toolkit 使用 boot2docker 映像,则问题源于 boot2docker 虚拟机空间不足。

当您执行 docker import 或添加新图像时,图像会被复制到可能已满的 /mnt/sda1 中。

检查映像中可用空间的一种方法是 ssh 进入 vm 并运行 df -h 并检查 /mnt/sda1 中的剩余空间

ssh 命令是 docker-machine ssh default

一旦确定确实是空间问题,您可以根据此问题的一些答案中的说明进行清理,也可以选择通过增加 /mnt/sda1 上的空间来调整 boot2docker 映像本身的大小

您可以按照此处的说明调整图像大小 https://gist.github.com/joost/a7cfa7b741d9d39c1307


M
M3RS

我运行以下命令。

之后无需重建图像。

docker rm $(docker ps -qf 'status=exited')
docker rmi $(docker images -qf "dangling=true")
docker volume rm $(docker volume ls -qf dangling=true)

这些删除退出/悬空的容器和悬空的卷。


A
Ajit Ganiger

这可能是由于默认存储空间设置为 40GB(默认路径,/var/lib/docker)

您可以更改存储卷以指向不同的路径

编辑文件-> /etc/sysconfig/docker-storage

更新以下行(如果不存在则添加)

DOCKER_STORAGE_OPTIONS='--storage-driver=overlay --graph=CUSTOM_PATH'

重启 docker systemctl stop docker systemctl daemon-reload systemctl start docker

如果您运行命令 docker info (它应该将存储驱动程序显示为覆盖)


D
Dave

这么多关于修剪语句的帖子。确实,此命令将清理 docker 文件,如果实际存储空间受到阻碍,它不会修复您的系统。对我来说,问题是服务器的存储空间已经满了。因此我有两个选择。

选项 1:清理现有空间

运行其他人所说的所有系统修剪命令。 df -H,还剩多少空间?使用 du --block-size=M -a / | 检查系统上占用这么多空间的内容排序-n -r | head -n 20,这将显示 20 个最大的文件。删除文件或将它们移出系统。

选项 2:获得更多空间

为硬盘驱动器添加更多空间,然后进行扩展。如果您像我一样只有一个 HD,我必须安装名为“gparted”的操作系统并扩展驱动器。


S
SnellyBigoda

似乎有几种方法可以发生这种情况。我遇到的问题是 docker 磁盘映像已达到其最大大小(如果您想查看 OSX 中的大小,则 Docker Whale -> Preferences -> Disk)。

我提高了限制,并且很高兴。我确信清理未使用的图像也会起作用。


B
Bildad N. Urandu

对我来说,docker system prune 做到了。我正在运行mac os。


当我试图清理 Mac OS 上已用的空间时,这实际上也适用于我。使用命令 docker volume ls 没有返回任何内容,因此看起来存储主要用于缓存和悬空图像。
v
vgel

就我而言,发生这种情况是因为我超过了 10Gb 的 Docker 映像大小限制。看来这已经有所缓解,并且有一种方法可以将限制增加到 100Gb (https://github.com/moby/moby/issues/5151),但我不确定如何 - 对于我的用例,切换到映射卷很好,它有反正性能更好。


h
htnawsaj
$ docker rm $(docker ps -aq)

这对我有用

docker system prune 

最新版本似乎是更好的选择


G
Guillermo A Moran-Arreola

我刚碰到这个。我在 Ubuntu 20.04 上。什么有效?重新安装 Docker:

sudo apt-get purge docker-ce docker-ce-cli containerd.io
sudo apt-get install docker-ce docker-ce-cli containerd.io

有点粗鲁,我知道。我尝试修剪 Docker,但它仍然无法正常工作。


重新安装docker,因为磁盘已满,并不是真正的解决方案。