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
之后,当我第一次尝试创build一个图像失败,出现以下错误
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"
这是docker信息
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
我如何增加内存? 系统configuration存储在哪里?
从Kal的build议:
当我摆脱了所有的图像和容器,它释放了一些空间和图像构build跑了很长时间之前,相同的错误失败。 所以问题是,这是指哪个空间,如何configuration?
我有同样的错误,并以这种方式解决:
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>
图像(这些图像有时是在build立图像时生成的,如果由于某种原因造成图像被打断,则会停留在那里)。
这是一个很好的脚本,我用它来删除它们
docker rmi $(docker images | grep '^<none>' | awk '{print $3}')
然后,如果您使用Docker Compose为每个项目本地构build图像。 你最终会得到很多像你的文件夹一样命名的图像(例如,如果你的项目文件夹名为Hello,你会发现图像名称为Hello_blablabla
)。 所以也考虑删除所有这些图像
您可以编辑上述脚本以将其删除或手动删除它们
docker rmi {image-name}
检查/ var上的可用空间,因为这是默认情况下(在/ var / lib / docker中)Docker存储图像文件的位置。
首先通过使用docker ps -a
来清理所有容器(包括停止的容器)和docker rm
来清除它们; 然后使用docker images
列出所有您存储的图像和docker rmi
删除它们。
接下来,在docker守护进程上用-g选项更改存储位置,或者编辑/etc/default/docker
DOCKER_OPTS
并将-g
选项添加到DOCKER_OPTS
。 -g
指定“Docker运行时”的位置,它基本上是Docker在创build映像和运行容器时创build的所有东西。 select一个具有足够空间的位置,因为磁盘空间会随着时间而增长。 如果编辑/etc/default/docker
,则需要重新启动docker守护程序才能使更改生效。
现在你应该可以创build一个新的镜像(或者从Docker Hub中拖出一个镜像),你应该可以看到使用-g选项指定的目录中创build了一堆文件。
UPDATE
随着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 rmi #IMAGE_ID
docker rm #CONTAINER_ID#
和docker rmi #IMAGE_ID
一次删除它们。
如果这只是Docker的testing安装(即不是生产),而且您不关心进行核清理,您可以:
清理所有容器: 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或生产path。 最重要的是,如果你有你的Dockerfile,很容易重build或者docker pull
。
立即删除所有未使用的容器,卷,networking和图像( 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或者使用更多空间的另一个位置也是摆脱这个错误的好select(请参阅如何更改docker镜像安装目录? )
您的cgroup已启用cpuset
控制器。 此控制器在NUMA环境中非常有用,它允许精确指定允许哪些CPU /内存组运行。
默认情况下,不会设置必需的cpuset.mems
和cpuset.cpus
,这意味着您的任务没有“剩余空间”,因此是错误。
解决这个问题的最简单的方法是在root cgroup中启用cgroup.clone_children
为1。 在你的情况下,应该是
echo 1 > /sys/fs/cgroup/docker/cgroup.clone_children
它将基本上指示系统自动从其父cgroup初始化容器的cpuset.mems
和cpuset.cpus
。
你也可以使用:
docker system prune
或只是卷:
docker volume prune
干净的docker使用,
docker images --no-trunc | grep '<none>' | awk '{ print $3 }' \ | xargs docker rm
1)清洁悬挂的图像
docker rmi $(docker images -f“dangling = true”-q)
2)删除不需要的卷
2)删除未使用的图像
2)删除未使用的容器
如果通过Docker Toolkit使用boot2docker映像,则问题源于boot2docker虚拟机的空间不足。
当您执行docker import
或添加新图像时,图像将被复制到可能已满的/mnt/sda1
中。
一种检查图像中可用空间的方法是将ssh放入vm中,然后运行df -h
并检查/ mnt / sda1中的剩余空间
ssh命令是docker-machine ssh default
一旦你确定它确实是一个空间问题,你可以按照这个问题的一些答案中的说明进行清理,或者你可以select调整boot2docker映像本身的大小,方法是增加/mnt/sda1
上的空间
你可以按照这里的指示做图像的大小调整https://gist.github.com/joost/a7cfa7b741d9d39c1307