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

use*_*mda 277 memory ubuntu temp 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
Run Code Online (Sandbox Code Playgroud)

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

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

这是码头工人信息

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

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

从Kal的建议:

当我摆脱所有图像和容器时,它释放了一些空间,并且图像构建运行时间更长,然后失败并出现相同的错误.所以问题是,这涉及哪个空间以及如何配置它?

Mah*_*alt 299

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

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

如果您想要保留一些数据,请务必小心

清理:

$ docker volume rm $(docker volume ls -qf dangling=true)
Run Code Online (Sandbox Code Playgroud)

附加命令:

列出悬空卷:

$ docker volume ls -qf dangling=true
Run Code Online (Sandbox Code Playgroud)

列出所有卷:

$ docker volume ls
Run Code Online (Sandbox Code Playgroud)

2.还要考虑删除所有未使用的图像.

首先摆脱<none>图像(这些图像有时是在构建图像时生成的,如果出于任何原因图像构建被中断,它们就会停留在那里).

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

docker rmi $(docker images | grep '^<none>' | awk '{print $3}')
Run Code Online (Sandbox Code Playgroud)

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

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

docker rmi {image-name}

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

Jos*_*ook 261

更新
随着Docker变得更加发达,以下命令已成为黑客攻击.目前的最佳做法是

docker system prune
Run Code Online (Sandbox Code Playgroud)

这将删除:

- all stopped containers
- all volumes not used by at least one container
- all networks not used by at least one container
- all dangling images
Run Code Online (Sandbox Code Playgroud)

如下所示,这是核.


要清理系统,请先卸下容器

$ docker rm $(docker ps -aq)
Run Code Online (Sandbox Code Playgroud)

然后删除图像

$ docker rmi $(docker images -q)
Run Code Online (Sandbox Code Playgroud)

这当然是核,将删除所有容器和所有图像.您可以通过docker rm #CONTAINER_ID#和删除它们docker rmi #IMAGE_ID.

  • ```docker system prune --all --volumes``` 帮助了我 (4认同)
  • “ docker system prune”对我有用。 (3认同)
  • 正如凯文史密斯指出的那样,这个错误很可能是由于你用了`df -ih`看到的inode用完了.要通过手术进行诊断,请输入`ncdu`然后按c进行文件计数,然后按C进行文件计数排序,以粗略估计使用所有inode的内容.如果问题确实是docker,那么使用最多inode的目录将立即显现出来. (2认同)
  • 确实应该对此进行投票并给出答案,因为它是正确的方法。建筑环境受到污染,现在在这里受到黑客攻击,可能会暂时修复它,但是正确的方法应该是“ docker system prune” (2认同)

Kal*_*Kal 68

检查/ 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选项指定的目录中创建了一堆文件.


dav*_*wil 41

用于 Mac 的 Docker

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

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

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

Preferences > Resources > Advanced > Disk Image Location
Run Code Online (Sandbox Code Playgroud)

*这适用于 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 的内容,但还不到41 GB 。


更新

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

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

  • 路径:`/Users/&lt;您的用户名&gt;/Library/Containers/com.docker.docker/Data/vms/0/Docker.raw` (3认同)
  • 谢谢你!这对我在 Mac Mojave 10.14.6 上有效。所有其他删除系统、图像、卷等的命令都清理了一些空间,但不允许我构建,这终于起作用了 (2认同)

小智 29

如果它只是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.


RoB*_*ToZ 25

如前所述,

docker system prune
Run Code Online (Sandbox Code Playgroud)

可以提供帮助,但使用Docker 17.06.1及更高版本时不会修剪未使用的卷。从Docker 17.06.1开始,以下命令也修剪卷:

docker system prune --volumes
Run Code Online (Sandbox Code Playgroud)

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

  • 今天,当这里的所有其他解决方案都停止工作时,“docker volume prune”对我有所帮助。 (3认同)
  • `docker system prune --volumes` 对我有用,但我必须先手动停止并删除所有容器。否则,“prune”命令将挂起并且无法删除卷。也许我有一个没有反应的容器。 (2认同)
  • ```docker system prune --all --volumes``` 帮助了我 (2认同)

ken*_*orb 19

如果您使用的是 Docker 桌面,则可以通过转至 Docker 的首选项高级设置中增加磁盘映像大小

这是来自 macOS 的屏幕截图:

macOS 上的 Docker 桌面、资源、高级、磁盘映像大小

  • 这是迄今为止最好的选择,不是每次,我想取消我的缓存,然后重新开始,尤其是在我的网速较慢的情况下。我有空间,所以让我利用我的磁盘。 (6认同)

May*_*ary 16

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

docker system prune --all

最终奏效的解决方案:

  1. 码头工人信息
    • 检查当前的 docker 存储驱动程序
    • 我的是:存储驱动程序:devicemapper;如果您有作为overlay2 的存储驱动程序,则无需担心。解决方案仍然适用于您。
  2. 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 之类的地方。
  3. mkdir /apps/newdocker/docker
  4. chmod -R 777 /apps/newdocker/docker
  5. 更新 linux 上的 docker.serive 文件,该文件位于:/usr/lib/systemd/system
    • vi /usr/lib/systemd/system/docker.service
  6. 如果存储设备是 devicemapper ,请注释现有的 ExecStart 行并在 [Service] 下添加以下内容:
    • 执行开始=
    • 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
  7. 或者如果存储设备是overlay2:
    • 只需在现有的 ExexStart 语句中添加 -g /apps/newdocker/docker 即可。
    • 类似于 ExecStart=/usr/bin/dockerd -g /apps/newdocker/docker -H fd:// --containerd=/run/containerd/containerd.sock
  8. rm -rf /var/lib/docker (它将删除所有现有的docker数据)
  9. systemctl 停止泊坞窗
  10. ps辅助| grep -i docker | grep -v grep
    • 如果上述命令没有产生任何输出,请通过以下命令重新加载 systemd 守护进程。
  11. systemctl 守护进程重新加载
  12. systemctl 启动泊坞窗
  13. 码头工人信息
    • 在将 docker 安装到新文件系统后,查看可用数据空间:62.15GB。
  14. 完毕


pun*_*lly 15

Docker留下悬空的图像可以占用你的空间.要在Docker之后清理,请运行以下命令:

docker image prune [-af if you want to force remove all images]
Run Code Online (Sandbox Code Playgroud)

或者使用旧版本的Docker:

docker rm $(docker ps -q -f 'status=exited')
docker rmi $(docker images -q -f "dangling=true")
Run Code Online (Sandbox Code Playgroud)

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


jos*_*kal 14

  1. 清洁悬垂的图像 docker rmi $(docker images -f "dangling=true" -q)
  2. 删除不需要的卷
  3. 删除未使用的图像
  4. 删除未使用的容器


小智 14

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

来自 MacOS docker 仪表板的图像


小智 13

1. 移除容器

$ docker rm $(docker ps -aq)

2. 删除图像

$ docker rmi $(docker images -q)

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

docker system prune

此命令将删除:

  • 所有停止的容器
  • 至少一个容器未使用的所有卷
  • 至少一个容器未使用的所有网络
  • 所有悬垂的图像


Gui*_*ume 10

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

docker system prune -a -f --volumes
Run Code Online (Sandbox Code Playgroud)

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

docker rm -f $(docker ps -a -q)
docker system prune -a -f --volumes
Run Code Online (Sandbox Code Playgroud)

增加/ var/lib/docker或使用具有更多空间的其他位置也是摆脱此错误的一个很好的替代方法(请参阅如何更改docker映像安装目录?)

  • 到底是什么。`docker system prune` 删除了一些 7GB 的东西。`docker system prune --volumes` 额外增加了 4GB 左右,然后 `docker system prune -a -f --volumes` 删除了 **575.5GB** 的内容。瓦特。这是磁盘内容分析器无法捕获的所有占用空间。这个答案应该比较高。“-a”和“-f”标志可以产生巨大的差异。 (8认同)
  • `docker system prune -a -f --volumes` 将删除卷。 (2认同)

小智 10

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

docker system prune -a
Run Code Online (Sandbox Code Playgroud)

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

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

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


ale*_*oid 9

你也可以用:

docker system prune
Run Code Online (Sandbox Code Playgroud)

或者只是卷:

docker volume prune
Run Code Online (Sandbox Code Playgroud)


Jør*_*gen 9

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

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

docker system df
Run Code Online (Sandbox Code Playgroud)

输出:

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

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

docker builder prune
Run Code Online (Sandbox Code Playgroud)


Vel*_*elu 7

就我而言,我运行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)
Run Code Online (Sandbox Code Playgroud)

  • 直到`docker system df`,谢谢! (4认同)

小智 6

使用以下命令清理Docker:

docker images --no-trunc | grep '<none>' | awk '{ print $3 }' \
| xargs docker rmi
Run Code Online (Sandbox Code Playgroud)


Kos*_*tyn 6

就我而言,安装ubuntu-server 18.04.1(出于某些奇怪的原因)创建了一个LVM逻辑卷,其大小仅为4GB,而不是750GB。因此,当我拉图像时,我会得到这个“设备上没有剩余空间”的错误。解决方法很简单:

lvextend -l 100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv
resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv
Run Code Online (Sandbox Code Playgroud)


yad*_*taf 5

您的cgroup已cpuset启用控制器.该控制器在NUMA环境中非常有用,它允许精确指定允许您运行任务的CPU /内存库.

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

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

echo 1 > /sys/fs/cgroup/docker/cgroup.clone_children
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

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

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

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

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

docker images -f "dangling=true" -q
Run Code Online (Sandbox Code Playgroud)

按图像 id 删除图像。

docker rmi IMAGE_ID
Run Code Online (Sandbox Code Playgroud)

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