磁盘尚有空间却遇OSError: [Errno 28]设备无剩余空间的Docker问题求助
问题:Docker构建提示设备无剩余空间但实际磁盘有剩余
问题现象
- 之前使用
jupyter/datascience-notebook镜像部署的容器中,部分笔记本无法连接内核,报错:[Errno 28] No space left on device: '/home/jovan/.local/share//jupyter/runtime/kernel-b87ad915-8d97-44ac-80a6-0ab7bd5580bf.json' - 删除容器后执行以下命令重建时失败:
D:\Github\compras-publicas>docker compose run opt bash -c "cd ./src && ./pipeline-join.sh && ./pipeline-clean.sh" - 构建过程中
RUN pip install dbfread步骤报错,错误日志:[+] Building 2.5s (6/14) => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 32B 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/jupyter/datascience-notebook:latest 1.4s => CACHED [ 1/10] FROM docker.io/jupyter/datascience-notebook:latest@sha256:50b773a924586ee721f7729a2dbcb9103a6c 0.0s => [internal] load build context 0.0s => => transferring context: 37B 0.0s => ERROR [ 2/10] RUN pip install dbfread 1.1s ------ > [ 2/10] RUN pip install dbfread: #0 0.709 ERROR: Exception: #0 0.709 Traceback (most recent call last): #0 0.709 File "/opt/conda/lib/python3.11/site-packages/pip/_internal/cli/base_command.py", line 169, in exc_logging_wrapper #0 0.709 status = run_func(*args) #0 0.709 ^^^^^^^^^^^^^^^ #0 0.709 File "/opt/conda/lib/python3.11/site-packages/pip/_internal/cli/req_command.py", line 248, in wrapper #0 0.709 return func(self, options, args) #0 0.709 ^^^^^^^^^^^^^^^^^^^^^^^^^ #0 0.709 File "/opt/conda/lib/python3.11/site-packages/pip/_internal/commands/install.py", line 333, in run #0 0.709 build_tracker = self.enter_context(get_build_tracker()) #0 0.709 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #0 0.709 File "/opt/conda/lib/python3.11/site-packages/pip/_internal/cli/command_context.py", line 27, in enter_context #0 0.709 return self._main_context.enter_context(context_provider) #0 0.709 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #0 0.709 File "/opt/conda/lib/python3.11/contextlib.py", line 505, in enter_context #0 0.709 result = _enter(cm) #0 0.709 ^^^^^^^^^^ #0 0.709 File "/opt/conda/lib/python3.11/contextlib.py", line 137, in __enter__ #0 0.709 return next(self.gen) #0 0.709 ^^^^^^^^^^^^^^ #0 0.709 File "/opt/conda/lib/python3.11/site-packages/pip/_internal/operations/build/build_tracker.py", line 46, in get_build_tracker #0 0.709 root = ctx.enter_context(TempDirectory(kind="build-tracker")).path #0 0.709 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #0 0.709 File "/opt/conda/lib/python3.11/site-packages/pip/_internal/utils/temp_dir.py", line 125, in __init__ #0 0.709 path = self._create(kind) #0 0.709 ^^^^^^^^^^^^^^^^^^ #0 0.709 File "/opt/conda/lib/python3.11/site-packages/pip/_internal/utils/temp_dir.py", line 164, in _create #0 0.709 path = os.path.realpath(tempfile.mkdtemp(prefix=f"pip-{kind}-")) #0 0.709 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #0 0.709 File "/opt/conda/lib/python3.11/tempfile.py", line 368, in mkdtemp #0 0.709 _os.mkdir(file, 0o700) #0 0.709 OSError: [Errno 28] No space left on device: '/tmp/pip-build-tracker-kcli6ob4' #0 0.949 WARNING: There was an error checking the latest version of pip. ------ failed to solve: executor failed running [/bin/bash -o pipefail -c pip install dbfread]: exit code: 2
磁盘空间检查结果
执行df -h输出:
Filesystem Size Used Avail Use% Mounted on /dev/sdd 251G 1.8G 237G 1% / none 5.9G 4.0K 5.9G 1% /mnt/wsl /dev/sdc 251G 245G 0 100% /mnt/wsl/docker-desktop-data/isocache none 5.9G 12K 5.9G 1% /mnt/wsl/docker-desktop/shared-sockets/host-services /dev/sdb 251G 120M 239G 1% /mnt/wsl/docker-desktop/docker-desktop-user-distro /dev/loop0 476M 476M 0 100% /mnt/wsl/docker-desktop/cli-tools tools 118G 85G 34G 72% /init none 5.9G 4.0K 5.9G 1% /run none 5.9G 0 5.9G 0% /run/lock none 5.9G 0 5.9G 0% /run/shm none 5.9G 0 5.9G 0% /run/user tmpfs 5.9G 0 5.9G 0% /sys/fs/cgroup drivers 118G 85G 34G 72% /usr/lib/wsl/drivers lib 118G 85G 34G 72% /usr/lib/wsl/lib drvfs 118G 85G 34G 72% /mnt/c drvfs 932G 580G 353G 63% /mnt/d drvfs 932G 652G 280G 70% /mnt/e
解决方案(入门级)
问题核心是WSL环境中Docker的镜像缓存分区/dev/sdc已占满,/dev/loop0是CLI工具镜像,满了不影响核心功能,无需关注。
方法1:清理Docker无用资源
- 图形界面操作:打开Docker Desktop,进入
设置->资源->磁盘,点击清理按钮,删除未使用的镜像、容器、卷和缓存。 - 命令行操作:在WSL终端执行:
执行时输入docker system prune -ay确认,该命令会删除所有未被容器使用的镜像、容器、网络和卷,释放大量空间。
方法2:调整Docker磁盘配额
打开Docker Desktop的设置 -> 资源 -> 高级,调整磁盘使用的最大配额(确保主机磁盘有剩余空间),保存后重启Docker Desktop。
方法3:临时指定pip临时目录
如果不想清理镜像,可修改Dockerfile,将pip安装的临时文件指向主机有空间的目录,比如:
ENV TMPDIR /mnt/d/tmp RUN mkdir -p $TMPDIR && pip install dbfread
将/mnt/d/tmp替换为你主机上有足够空间的路径(比如D盘的tmp文件夹),这样pip安装时会把临时文件放到该目录,避免占用WSL的临时空间。
内容的提问来源于stack exchange,提问作者Chvz
相关产品推荐
相关产品推荐

