Jason's Blog

November 13, 2024

Something Came over when building DOCKER IMAGE

documentation1.8 min to read

问题描述

在使用 Docker 构建镜像时,遇到了以下错误:

ERROR: failed to solve: failed to copy: write /var/lib/docker/buildkit/...: no space left on device

同时通过 free -h 命令查看系统内存和交换空间发现它们都很充足,因此疑惑为何会出现 "no space left on device" 的错误。

问题原因

该错误与内存无关,而是由于 磁盘空间 不足导致的。使用 df -h 命令检查磁盘的使用情况可以看到,根分区 (/dev/mapper/centos-root) 的空间几乎用尽:

Docker 的数据存储位置默认在 /var/lib/docker,该目录位于根分区中。因此,由于根分区空间不足,Docker 无法继续写入数据,导致构建失败。

解决方案

  1. 清理根分区中的空间

    你需要在根分区中释放一些空间,以确保 Docker 构建有足够的可用磁盘空间。

    • 清理 Docker 缓存

      docker system prune -a

      这个命令会删除所有未使用的容器、镜像、网络和挂载卷。请在确认不需要这些对象时使用。

    • 删除不必要的日志文件

      /var/log 目录中可能存储了许多日志文件,这些文件有时会非常大。你可以使用以下命令来查找较大的日志文件:

      sudo du -sh /var/log/*

      然后可以删除不需要的日志文件或将其内容清空:

      sudo truncate -s 0 /var/log/filename.log
    • 清理系统缓存

      使用以下命令来清理 yumdnf 的缓存,释放一些空间:

      sudo yum clean all
    • 查找其他大文件

      查找根分区中占用大量空间的文件和目录,尝试清理它们:

      sudo du -sh /* 2>/dev/null | sort -hr | head -n 20

      这个命令会列出根目录下占用空间最大的 20 个文件或目录,你可以进一步查找并清理不需要的内容。

  2. 迁移 Docker 存储位置

    由于 /home 分区有 20TB 的可用空间,可以考虑将 Docker 数据存储位置迁移到 /home 分区上。

    1. 创建一个新的目录用于 Docker 数据存储,例如 /home/docker-data

      sudo mkdir /home/docker-data
    2. 修改 Docker 配置文件 /etc/docker/daemon.json,设置 data-root 为新目录:

      {
        "data-root": "/home/docker-data"
      }
    3. 重启 Docker 服务:

      sudo systemctl restart docker
  3. 扩展根分区【OPTIONAL】

    如果可能,你可以考虑扩展根分区的大小。由于 /home 分区有足够多的可用空间,可以缩减 /home 的大小并增加 / 的大小。这种方法涉及到重新分区,可能需要重启系统,并有一定风险,因此需要备份重要数据后进行。

  4. 使用软链接迁移部分数据

    如果不想更改 Docker 的配置文件,可以将 Docker 的数据目录从 /var/lib/docker 移动到 /home 分区,然后创建一个软链接:

    1. 停止 Docker 服务:

      sudo systemctl stop docker
    2. 移动 Docker 目录:

      sudo mv /var/lib/docker /home/docker-data
    3. 创建软链接:

      sudo ln -s /home/docker-data /var/lib/docker
    4. 重启 Docker 服务:

      sudo systemctl start docker

总结