繁体   English   中英

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

[英]Docker error : no space left on device

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

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

当前的最佳实践是:

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]

换句话说,继续执行此命令是永久性的。 请记住,最佳实践是将停止的容器视为短暂的,即您应该使用 Docker 设计您的工作,而不是保留这些停止的容器。 如果您不主动调试容器,您可能需要考虑在运行时使用--rm标志

确保你阅读了这个答案,re:Volumes

如果docker system prune对您不起作用,您可能也对这个答案感兴趣。

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

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}

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

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

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

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

如前所述,

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

用于 Mac 的 Docker

所以docker system prune --volumes 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 ,为 Mac 重新启动了 Docker,然后该文件又自动创建并恢复为0GB

一切都像以前一样继续工作,当然我丢失了我的 Docker 缓存。 正如预期的那样,在运行了一些 Docker 命令后,文件开始再次填满几 GB 的内容,但还不到41 GB。


更新

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

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

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

清理所有容器: docker ps -a | sed '1 d' | awk '{print $1}' | xargs -L1 docker rm 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 images -a | sed '1 d' | awk '{print $3}' | xargs -L1 docker rmi -f

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

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

docker system prune -a -f --volumes

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

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

增加 /var/lib/docker 或使用具有更多空间的其他位置也是摆脱此错误的不错选择(请参阅如何更改 docker 映像安装目录?

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

这是来自 macOS 的屏幕截图:

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

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

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

我在 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. 完毕
  1. 清理悬挂的图像docker rmi $(docker images -f "dangling=true" -q)
  2. 删除不需要的卷
  3. 删除未使用的图像
  4. 移除未使用的容器

1. 移除容器

$ docker rm $(docker ps -aq)

2. 删除图像

$ docker rmi $(docker images -q)

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

docker system prune

此命令将删除:

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

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

来自 MacOS docker 仪表板的图像

您还可以使用:

docker system prune

或仅用于卷:

docker volume prune

就我而言,我没有那么多图像/容器,但构建缓存填满了我的 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 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 守护进程。

使用以下命令清理 Docker:

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

在我的情况下,安装 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

在我的例子中,我运行了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 prune命令。 它将删除所有 docker 网络、容器和图像。 因此,您最终也可能会丢失重要数据。

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

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

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

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

docker images -f "dangling=true" -q

按图像 id 删除图像。

docker rmi IMAGE_ID

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

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

我运行以下命令。

之后无需重建图像。

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

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

这可能是由于默认存储空间设置为 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 (它应该将存储驱动程序显示为覆盖)

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

选项 1:清理现有空间

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

选项 2:获得更多空间

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

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

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

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

$ docker rm $(docker ps -aq)

这对我有用

docker system prune 

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

我刚遇到这个。 我在 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,但它仍然不起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM