Docker定期清除容器日志

博客系统通过Docker部署,在生产环境下半年后的今天,居然把服务器硬盘给占满了,心里琢磨着,我Minio也没存啥大文件啊,开始定位,最后发现硬盘空间被Docker日志给嚯嚯没了,于是有了这篇文章。

脚本定时清空日志文件

按照占用空间大小升序现实日志文件夹:

sudo du -d1 -h /var/lib/docker/containers | sort -h

clear_docker_logs.sh

#!/bin/bash

# 检查日志目录是否存在
LOG_DIR="/xxx"
if [ ! -d "$LOG_DIR" ]; then
  echo "日志目录不存在: $LOG_DIR"
  exit 1
fi

# 查找并清空所有Docker容器的日志文件
find /var/lib/docker/containers/ -type f -name "*.log" -exec truncate -s 0 {} \;

# 检查清理日志操作是否成功
if [ $? -eq 0 ]; then
  echo "清除Docker日志文件于 $(date)" >> "$LOG_DIR/clear_docker_logs.log"
else
  echo "清理Docker日志文件失败于 $(date)" >> "$LOG_DIR/clear_docker_logs.log"
fi

/xxx 替换为你存放脚本的目录,或者

#!/bin/bash
echo "========= start clean docker containers logs ==========="
logs=$(find /var/lib/docker/containers/ -name *-json.log)
for log in $logs
  do
    echo "清理docker日志文件: $log"
    cat /dev/null > $log
  done
echo "========= end clean docker containers logs  ==========="

使用cron作业

打开crontab编辑器

crontab -e

在crontab文件中添加以下行

0 2 * * * /xxx/xxx/clear_docker_logs.sh

0 2 * * * cron表达式自己替换

确保脚本有执行权限

chmod +x /xxx/xxx/clear_docker_logs.sh

这样设置完成后,脚本将会按预定时间自动运行。

全局容器日志大小

vim /etc/docker/daemon.json

添加如下配置

{
    "log-driver":"json-file",
    "log-opts":{
        "max-size" :"50m",
        "max-file":"3"
    }
}

说明:

max-size=50m 意味着一个容器日志大小上限是50M

max-file=3 意味着一个容器有三个日志,分别是id+.json、id+1.json、id+2.json。可以存在的最大日志文件数。如果超过最大值,则会删除最旧的文件。“仅在max-size设置时有效”,默认为5。

重载配置,重启docker

systemctl daemon-reload
systemctl restart docker

注意事项

修改配置后重启docker只对新建的容器有效,对已存在的容器不会有影响,需要重建才可生效。

修改日志驱动

docker 的日志驱动有很多种,以下是官网给的列表:

详情见docker doc

通过以下命令查看当前默认配置的日志驱动

docker info --format '{{.LoggingDriver}}'

修改配置文件

vim /etc/docker/daemon.json

添加如下配置

{
  "log-driver": "local"
}

重载配置,重启docker

systemctl daemon-reload
systemctl restart docker