OSError:[Errno 28]设备Docker上没有剩余空间,但我有空间

时间:2017-06-21 00:13:25

标签: python docker

正如标题所示,我在一个docker容器中运行jupyter,并且我从以下行的scikit learn / numpy库中深入了解python的OSError:

pickler.file_handle.write(chunk.tostring('C'))

我做了一些故障排除,人们似乎遇到的大多数问题是他们的硬盘驱动器或RAM实际上空间不足,而AFAIK则不然。

这就是我的df的样子:

Filesystem                    1K-blocks       Used   Available Use% Mounted on
udev                           16419976          0    16419976   0% /dev
tmpfs                           3288208      26320     3261888   1% /run
/dev/sdb7                     125996884   72177548    47395992  61% /
tmpfs                          16441036     238972    16202064   2% /dev/shm
tmpfs                              5120          4        5116   1% /run/lock
tmpfs                          16441036          0    16441036   0% /sys/fs/cgroup
/dev/sdb2                         98304      32651       65653  34% /boot/efi
tmpfs                           3288208         68     3288140   1% /run/user/1000
//192.168.1.173/ppo-server3 16864389368 5382399064 11481990304  32% /mnt/ppo-server3

这是我的免费样式:

             total        used        free      shared  buff/cache   available
Mem:       32882072     7808928    14265280      219224    10807864    24357276
Swap:        976892      684392      292500

我在看正确的df和免费输出吗?它们都是从容器内的bash实例运行的。

4 个答案:

答案 0 :(得分:13)

如@PeerEZ所述,当sklearn尝试并行化作业时会发生这种情况。

sklearn尝试通过写入/ dev / shm在进程之间进行通信,这在docker容器上限制为64mb。

您可以尝试使用@PeerEZ建议的n_jobs = 1运行(如果您无法重新启动容器),或者如果需要并行化,请尝试使用--shm-size选项运行容器来设置/ dev / shm的大小更大。例如。 -

docker run --shm-size=512m <image-name>

答案 1 :(得分:5)

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

docker system prune -af

或旧版本的docker:

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

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

Meta:把这个答案放在这里,因为它是该失败的顶级堆栈溢出结果,这是一个修复它。

答案 2 :(得分:1)

如果它对任何人有帮助,我会收到同样的错误,问题是我的一个应用日志文件 (laravel.log) 的大小接近 11GB。删除该文件解决了我的问题。

答案 3 :(得分:1)

我在 Docker 中运行并行进程时遇到了同样的问题。 麻烦的是,默认情况下,某些进程使用 /dev/shm 来存储一些缓存数据,而 linux 中该位置的大小默认约为 64MB。 您可以使用 python 中的这两条代码行更改并行作业存储缓存的路径。如果正在阅读本文的人正在使用 Pandaralel,则此解决方案可以为您提供帮助。

import os

os.environ['JOBLIB_TEMP_FOLDER'] = '/tmp'

pandaralel 的用户也添加这一行

pandarallel.initialize(use_memory_fs = False )