使用 Jenkins 和 Docker 构建时“设备上没有剩余空间”

Posted

技术标签:

【中文标题】使用 Jenkins 和 Docker 构建时“设备上没有剩余空间”【英文标题】:"no space left on device" when building with Jenkins and Docker 【发布时间】:2019-09-13 10:40:14 【问题描述】:

我们使用 Jenkins 来构建 Docker 镜像,直到上周我每次尝试在 Jenkins 中构建镜像时,它都会失败并显示“来自守护进程的错误响应:错误处理 tar 文件(退出状态 1):写入 /app /node_modules/acorn/dist/acorn_loose.es.js:设备上没有剩余空间”(它失败的文件可能取决于项目)。如果我尝试在服务器中使用 Docker 但在 Jenkins 上失败,图像将会构建。

我曾尝试删除旧容器和图像等,但无济于事。磁盘空间和 inode 似乎很好,所以我不确定现在该尝试什么。任何帮助表示赞赏。

“码头信息”的结果:

Containers: 55
 Running: 48
 Paused: 0
 Stopped: 7
Images: 59
Server Version: 17.03.2-ce
Storage Driver: overlay
 Backing Filesystem: extfs
 Supports d_type: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 4ab9917febca54791c5f071a9d1f404867857fcc
runc version: 54296cf40ad8143b62dbcaa1d90e520a2136ddfe
init version: 949e6fa
Security Options:
 seccomp
  Profile: default
Kernel Version: 4.9.45-rancher
Operating System: RancherOS v1.1.0
OSType: linux
Architecture: x86_64
CPUs: 8
Total Memory: 19.61 GiB
Name: rancher
ID: Z7Z3:T3NW:N4O3:FKMZ:7KH6:FJ7R:TJ6A:FXLW:KNUL:WMRC:ED74:KHEM
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Experimental: false
Insecure Registries:
 dockerhub.companysite.net:5000
 127.0.0.0/8
Live Restore Enabled: false

“df -h”的结果:

Filesystem      Size  Used Avail Use% Mounted on
overlay          47G   27G   18G  60% /
tmpfs           9.9G     0  9.9G   0% /dev
tmpfs           9.9G     0  9.9G   0% /sys/fs/cgroup
/dev/sda1        47G   27G   18G  60% /.r
shm              64M     0   64M   0% /dev/shm
tmpfs           9.9G     0  9.9G   0% /sys/firmware

“df -ih”的结果:

Filesystem     Inodes IUsed IFree IUse% Mounted on
overlay           13M  2.8M  9.8M   22% /
tmpfs            2.5M    16  2.5M    1% /dev
tmpfs            2.5M    15  2.5M    1% /sys/fs/cgroup
/dev/sda1         13M  2.8M  9.8M   22% /.r
shm              2.5M     1  2.5M    1% /dev/shm
tmpfs            2.5M     1  2.5M    1% /sys/firmware

【问题讨论】:

TAR 文件有多大? @vivekyad4v 仅 20.78MB 您的 Jenkins 本身是否作为 docker 容器运行?可以分享一下构建失败的 Dockerfile 吗? 【参考方案1】:

您可能会留下一堆导致问题的旧悬空图像,请尝试:

docker volume rm $(docker volume ls -qf dangling=true)

(这确实会删除内容,因此您可能需要在执行此操作之前检查是否有任何内容要保留在任何悬空卷中)

【讨论】:

我试过了,但没有解决问题,因为根据“docker volume ls -qf dangling=true”没有留下任何悬空图像 可能听起来很愚蠢,但是您是否尝试过重新启动 docker 服务?它可能正在悄悄地持有已删除的内容 由于正在运行的容器数量等原因,我不愿意重新启动 Docker 服务,我对 Docker 比较陌生,所以对我尝试的方法有点怀疑。重启 Docker 服务会影响容器等吗? 是的,这将导致您需要重新启动它们 这就是为什么我现在还不想重启服务。如果我从 RancherOS 服务器运行构建命令,那么它构建没有错误,但如果我从 Jenkins UI 运行构建,那么它会失败,“设备上没有剩余空间”,这让我相信 Docker 工作正常,但 Jenkins 不是?在 Jenkins 记录“将构建上下文发送到 Docker 守护进程 20.78MB”消息后,它立即失败。【参考方案2】:

您应该清理旧容器、图像和卷。您可以使用 prune 仅通过一个命令将其删除:

docker system prune

删除所有未使用的容器、网络、图像(包括悬空的和未引用的)以及可选的卷。

输出:

WARNING! This will remove:
        - all stopped containers
        - all networks not used by at least one container
        - all dangling images
        - all build cache
Are you sure you want to continue? [y/N] y

【讨论】:

以上是关于使用 Jenkins 和 Docker 构建时“设备上没有剩余空间”的主要内容,如果未能解决你的问题,请参考以下文章

使用Docker和Jenkins运行测试 - 测试结果

jenkins构建docker镜像

Docker+Jenkins持续集成环境使用docker+jenkins构建nodejs前端项目

使用Jenkins构建Docker镜像

使用 jenkins 在 RTC 上保存构建定义时出错

如何在 Jenkins 的 HTTP_PROXY 后面使用 Dockerfile 构建 Docker 映像?