操作系统错误:[Errno 28] 设备上没有剩余空间 Docker,但我有空间。

31

正如标题所示,我正在Docker容器中运行Jupyter,并且在以下行中从Python的Scikit-Learn / NumPy库中获得OSError:

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

我已经进行了一些故障排除,大多数人似乎遇到的问题是硬盘或内存实际上已经用完了空间,但在我看来这并不是我的情况。

这是我的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和free输出?这两个命令都是在容器内部的bash实例中运行吗?


你好,配额未在主机(Ubuntu)或Docker上安装。 - user2886057
也许你的代码中有一些问题导致了这个错误的产生?你尝试在本地运行代码,看看是否能够复制代码的某种故障吗? - idjaw
1
请务必检查inode使用情况(df -i);如果您正在使用overlay存储驱动程序,则inode用尽可能是此错误的原因。https://docs.docker.com/engine/userguide/storagedriver/overlayfs-driver/#limitations-on-overlayfs-compatibility - thaJeztah
4
当在Docker容器中运行Jupyter时,我遇到了和你一样的问题。问题最终被确认是由并行化引起的:我尝试同时运行2个作业,这在pickle序列化期间会消耗大量空间。只运行一个作业就解决了这个问题。 - PeerEZ
嗨,我在进行 docker build 安装 scikit-learn 时遇到了相同的问题 ERROR: Could not install packages due to an OSError: [Errno 28] No space left on device,该如何解决? - Swapnil Masurekar
显示剩余2条评论
4个回答

65

Docker会留下一些无用的镜像占据您的空间。要清理Docker,请运行以下命令:

docker system prune -af
我们可以使用“until”关键字和“--filter”选项来删除早于给定时间戳或持续时间创建的对象,如下所示(早于2分钟的对象):
docker system prune -a --filter “until=2m”

或在较早版本的Docker中:

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

这将移除已退出和悬挂的镜像,希望能清理出设备空间。

更多阅读

元信息:将此答案放在这里是因为它是最高的stackoverflow结果,而这是一个可能的解决方法。


感谢您提供最佳修剪答案,这解决了我的问题。 - Swapnil Masurekar
2
docker system prune -af 将删除全部内容。 - geniaz1
1
"docker system prune -af 会删除所有内容。" 不,它不会移除任何正在运行的容器。 - punkrockpolly
3
这是危险和糟糕的建议。 几乎不可能有任何遇到此问题的人想要删除系统中每个未正在运行的图像。 - Michael Dausmann
回复:“危险和糟糕的建议。” 至少有50人投了赞成票,所以感觉足够安全。容器的重点是您可以重新创建需要运行的容器。我还链接到其他参数的文档,您可以将其传递给“prune”。 - punkrockpolly
1
警告!请不要使用此功能。它将从您的设备中删除所有图像(对于指定的问题没有用处)。 - Umer

24

正如@PeerEZ在评论中提到的那样,当sklearn尝试并行处理作业时,会出现这种情况。

sklearn尝试通过向/dev/shm写入来在进程之间进行通信,但是在docker容器上,/dev/shm的大小仅限于64mb。

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

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

2

当我在Docker中运行并行进程时,遇到了同样的问题。问题在于,默认情况下某些进程使用/dev/shm来存储某些缓存数据,而在Linux中该位置的大小默认约为64MB。你可以使用以下两个代码行更改并行作业存储缓存的路径。如果阅读此内容的人使用Pandarallel,则此解决方案对您有帮助。

import os

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

对于使用pandarallel的用户,请添加此行代码。
pandarallel.initialize(use_memory_fs = False )

1
如果有帮助的话,我也遇到了相同的错误,问题在于我的一个应用程序日志文件(laravel.log)大小接近11GB。删除该文件解决了我的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接