问题
最近项目的jenkins编译时报错
FATAL: Unable to produce a script file
java.io.IOException: No space left on device
at java.io.UnixFileSystem.createFileExclusively(Native Method)
at java.io.File.createTempFile(File.java:2024)
at hudson.FilePath$CreateTextTempFile.invoke(FilePath.java:1467)
Caused: java.io.IOException: Failed to create a temporary directory in /tmp
at hudson.FilePath$CreateTextTempFile.invoke(FilePath.java:1469)
at hudson.FilePath$CreateTextTempFile.invoke(FilePath.java:1446)
at hudson.FilePath.act(FilePath.java:1076)
at hudson.FilePath.act(FilePath.java:1059)
at hudson.FilePath.createTextTempFile(FilePath.java:1441)
磁盘没有空间了,那怎么导致的。
排查
df -hl
如图:
/路径已经被占满了。/tmp自然不能再新增文件等
经排查是docker overlay2占用大量空间,contrainer空间日志过大
如图:
分析
查看docker占用虚拟空间
[root@test230 conf.d]# docker ps -s
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE
460855bf50c8 logstash:7.17.9 "/usr/local/bin/dock…" 2 hours ago Up 2 hours 0.0.0.0:5044->5044/tcp, :::5044->5044/tcp, 9600/tcp logstash 9.74MB (virtual 790MB)
结果正常
看下logstash的空间数据的日志文件
找到占用空间过大的contrainer中日志
查看docker空间占用情况(这个是解决后的)
[root@test230 config]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 1 1 780.2MB 0B (0%)
Containers 1 1 9.739MB 0B (0%)
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B
解决
修改docker的数据空间
默认是/var/lib/docker,系统空间,一般给的比较小
我们修改成空间大磁盘/home/docker_data/docker/data
vi /etc/docker/daemon.json
{
"data-root": "/home/docker_data/docker/data",
"registry-mirrors": ["https://b660ddgx.mirror.aliyuncs.com"]
}
需要重新拉去并启动,
这个能解决,系统空间问题,转移到大磁盘,但解决不了根本问题
彻底解决
清理contrainer中的大日志文件
临时方案:清空日志文件
cd /var/lib/docker/containers/container_id
> container_id-json.log
或者
cat /dev/null > /var/lib/docker/containers/*/*-json.log
注意⚠️:
别进入/var/lib/docker/containers/container_id目录,删除container_id-josn.log文件
因为:
使用rm -rf方式删除日志后,通过df -h会发现磁盘空间并没有释放。原因是在Linux或者Unix系统中,通过rm -rf或者文件管理器删除文件,将会从文件系统的目录结构上解除链接(unlink)。如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用。
自动任务清理
将临时方案写成脚本,使用crontab定时执行
#!/bin/sh
echo "======== start clean docker containers logs ========"
logs=$(find /var/lib/docker/containers/ -name *-json.log)
for log in $logs
do
echo "clean logs : $log"
cat /dev/null > $log
done
echo "======== end clean docker containers logs ========"
清理无用的contrainer
docker system prune [ -a]
清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)。
-a :清理得更加彻底,可以将没有容器使用Docker镜像都删掉。
设置docker容器日志大小全局控制或者容器控制
全局控制
创建或修改文件 /etc/docker/daemon.json,并增加以下配置
{
"log-driver":"json-file",
"log-opts":{
"max-size" :"50m","max-file":"1"
}
}
局部控制
docker run -it --log-opt max-size=10m --log-opt max-file=3 logstash
外传
😜 原创不易,如若本文能够帮助到您的同学
🎉 支持我:关注我+点赞👍+收藏⭐️
📝 留言:探讨问题,看到立马回复
💬 格言:己所不欲勿施于人 扬帆起航、游历人生、永不言弃!🔥