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

时间:2015-06-02 19:23:55

标签: ubuntu memory docker temp

我按照以下方式在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的建议:

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

30 个答案:

答案 0 :(得分:264)

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

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}

答案 1 :(得分:202)

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

docker system prune

这将删除:

- all stopped containers
- all volumes not used by at least one container
- all networks not used by at least one container
- all dangling images

如下所示,这是核。

要清理系统,请先删除容器

$ docker rm $(docker ps -aq)

然后删除图片

$ docker rmi $(docker images -q)

这当然是核,将删除所有容器和所有图像。您可以通过docker rm #CONTAINER_ID#docker rmi #IMAGE_ID一次删除一个。

答案 2 :(得分:65)

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

答案 3 :(得分:28)

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

答案 4 :(得分:14)

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

这是macOS的屏幕截图:

Docker Desktop on macOS, Resources, Advanced, Disk image size

答案 5 :(得分:13)

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")

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

答案 6 :(得分:9)

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

答案 7 :(得分:8)

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

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 守护进程。

答案 8 :(得分:7)

你也可以使用:

docker system prune

或只是卷:

docker volume prune

答案 9 :(得分:6)

使用以下命令清理Docker:

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

答案 10 :(得分:6)

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

docker system prune -a -f

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

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

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

答案 11 :(得分:6)

1。删除容器

$ docker rm $(docker ps -aq)

2。删除图像

$ docker rmi $(docker images -q)

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

docker system prune

此命令将删除:

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

答案 12 :(得分:5)

您的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

答案 13 :(得分:3)

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

该错误表明“设备上没有剩余空间”,因此我们只需要释放一些空间即可。

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

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

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

docker images -f "dangling=true" -q

按图像ID删除图像。

docker rmi IMAGE_ID

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

答案 14 :(得分:3)

如前所述,

docker system prune

有帮助,但在Docker 17.06.0及更早版本中,不修剪未使用的卷。 从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

答案 15 :(得分:3)

适用于Mac的Docker

docker system prunedocker system prune --volumes释放了的空间,这可以工作一段时间。但是最终,每次我执行任何操作时,我都会出错。

对我来说,实际上解决了根本问题的一件事是删除了Docker for Mac用于存储的Docker.raw文件,然后重新启动。

您可以通过Preferences > [Disk tab] > Disk Image Location > Reveal In Finder

在MacOS Finder中,它始终显示为您分配的大小,通常非常大(默认为64GB),但是那不是它在磁盘上的实际大小

要获取实际大小,请在终端中打开目录并运行

du -h Docker.raw

对我来说,它是 41GB !删除后,我重新启动了Mac的Docker,再次创建了它,并为 0GB (查找程序仍显示64GB-运行命令进行检查)。 然后错误消失了。

说实话,我不知道为什么docker system prunedocker system prune --volumes不能完全清除此文件的内容以及其中的其他内容。这可能是Docker for Mac中的错误,该错误使您不需要的内容缓存在该文件中。

无论如何,这是实际的问题。该文件仅分配了一定数量的磁盘空间,它最终用无法由Docker删除的内容填满了绝对限制,这时似乎唯一的继续方法是亲自手动删除它。 / p>

答案 16 :(得分:2)

在我的例子中,我运行了 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)

答案 17 :(得分:2)

我还在RHEL机器上遇到此问题。我在堆栈溢出和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 =
    • 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停止docker
  10. ps aux | grep -i泊坞窗| grep -v grep
    • 如果以上命令未产生任何输出,请通过以下命令重新加载systemd守护程序。
  11. systemctl守护程序重新加载
  12. systemctl启动docker
  13. 码头工人信息
    • 在将docker迁移到新文件系统后,签出可用数据空间:62.15GB。
  14. 完成

答案 18 :(得分:2)

就我而言,安装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

答案 19 :(得分:1)

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

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

  • 编辑文件-> / etc / sysconfig / docker-storage
  • 更新以下行(如果不存在则添加)

DOCKER_STORAGE_OPTIONS ='-存储驱动程序=覆盖--graph = CUSTOM_PATH'

  • 重新启动docker systemctl停止docker systemctl守护程序重新加载 systemctl启动docker

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

答案 20 :(得分:1)

我运行以下命令。

以后无需重建图像。

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

这些删除已存在/悬空的容器和悬空的卷。

答案 21 :(得分:1)

就我而言,我没有那么多映像/容器,但是构建缓存正在填满我的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

答案 22 :(得分:1)

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

我提高了限制,很高兴去。我敢肯定,清理未使用的图像也可以。

答案 23 :(得分:1)

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

当您执行"pdo" => PDO {#131 inTransaction: false attributes: array:11 [ "CASE" => NATURAL "ERRMODE" => EXCEPTION "PERSISTENT" => false "DRIVER_NAME" => "sqlsrv" "SERVER_INFO" => array:3 [ "CurrentDatabase" => "{{ DATABASE NAME }}" "SQLServerVersion" => "12.00.5207" "SQLServerName" => "{{ SERVER NAME }}" ] "ORACLE_NULLS" => NATURAL "CLIENT_VERSION" => array:4 [ "DriverDllName" => "msodbcsql13.dll" "DriverODBCVer" => "03.80" "DriverVer" => "13.00.0811" "ExtensionVer" => "4.1.7-preview+9506" ] "SERVER_VERSION" => "12.00.5207" "STATEMENT_CLASS" => array:1 [ 0 => "PDOStatement" ] "STRINGIFY_FETCHES" => false "DEFAULT_FETCH_MODE" => BOTH ] } 或添加新图片时,图片会被复制到可能已满的docker import

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

ssh命令是 df -h

一旦你确定它确实是一个空间问题,你可以根据这个问题的一些答案中的说明进行清理,或者你可以通过增加{的空间来选择调整boot2docker图像本身的大小。 {1}}

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

答案 24 :(得分:0)

docker system prune对我有用。我正在运行Mac OS。

答案 25 :(得分:0)

如果您正在使用pyCharm ..?然后

1。安装docker插件。 2.在调试区域的终端选项卡旁边,转到服务选项卡。 3.连接docker。 4.删除所有容器。 5.再次运行dockerfile。

这将解决存储问题。

答案 26 :(得分:0)

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

Image from MacOS docker dashboard

答案 27 :(得分:0)

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

选项 1:清理现有空间

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

选项 2:获得更多空间

  1. 为硬盘添加更多空间,然后扩展。如果你像我一样只有一个硬盘,我不得不挂载名为“gparted”的操作系统并扩展驱动器。

答案 28 :(得分:-1)

$ docker rm $(docker ps -aq)

这对我有用

答案 29 :(得分:-2)

我刚遇到这个。我正在使用Ubuntu 20.04。什么有效?重新安装Docker:

|head -n 5|tail -n 1

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