实现docker镜像中使用crontab定时删除n天前日志

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 实现docker镜像中使用crontab定时删除n天前日志

其实这篇文章承接前面的文章,ECS机器环境下可以直接页面配置机器日志定时删除任务,但接入云原生环境后,暂时还没有页面工具来配置定时任务,千台机器,多个日志,总不能一个个删除吧,于是就想到在docker镜像中通过写入crontab脚本来实现定时删除n天前日志


我的机器:Linux Centos7机器


先了解一下


关于定时任务的配置目录


/etc/crontab 文件, 系统级别的定时任务,需要加入用户名


/var/spool/cron 目录, 以用户作为区分,一般会有一个和用户名相同的文件,里面记录了定时任务, 一般使用 crontab -e 创建, 语法中不需要指定用户名


/etc/cron.d/ 和 crontab 文件类似,需要指定用户名


cron执行时,也就是要读取三个地方的配置文件


由于机器比较多,试错成本会比较大,所以可以先在单机执行验证


一、单机操作验证

1.创建定时任务脚本: del_log.sh

touch del_log.sh


2.授权 chmod +x ./del_log.sh

3.删除 3天的日志文件

vim del_log.sh
#!/usr/bin/env bash
#/home/logs为想删除日志所在的路径,前后加的两句输出可以验证是否执行了该文件
echo "Cleaning old logs..."
find /home/logs -mtime +3 -name "*.log.*" -exec rm -rf {} \;
echo "Done for cleaning old logs."

4.创建定时任务crontab

crontab -e , 添加一个定时任务, 或者 vim /etc/crontab 添加一条记录

#每天 0 点 10 分运行该命令文件
#为了方便验证,可以改为分钟级别或者几分钟后
10 0 * * * /home/cron/del_log.sh >> /var/log/cron.log 2>&1


具体时间设置可以参考下面

 # For details see man 4 crontabs
    # Example of job definition:
    # .---------------- minute (0 - 59)
    # |  .------------- hour (0 - 23)
    # |  |  .---------- day of month (1 - 31)
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
    # |  |  |  |  |
    # *  *  *  *  * user-name  command to be executed

5.重启定时任务或重启机器


(1)重启定时任务systemctl restart crond , 在 Ubuntu 上叫 cron systemctl restart cron

(2)重启机器,我是选择重启的机器

重启后,我的日志顺利被删除了,说明脚本OK,可以尝试在镜像中写了

⚠️注意


执行脚本使用/bin/sh(防止脚本无执行权限)

要执行的文件路径是从根开始的绝对路径(防止找不到文件)

尽量把要执行的命令放在脚本里,然后把脚本放在定时任务里。对于调用脚本的定时任务,可以把标准输出错误输出重定向到空。

定时任务中带%无法执行,需要加\转义

如果时上有值,分钟上必须有值;日和周不要同时使用,会冲突


二、docker镜像中使用crontab定时删除n天前日志


前面单机测试说的就比较多了,下面就简单一些


1.创建定时任务脚本del_log.sh


#!/usr/bin/env bash
#定时删除日志
a=$(date)
echo -e "startTime:\t$a"
#找到/home/logs下符合"*.log.*格式的三天前的日志进行删除
find /home/logs -mtime +3 -name "*.log.*" -exec rm -rf {} \;
echo "Done for cleaning old logs.."


2.创建定时任务文件root


#凌晨3点整执行/etc/del_log.sh脚本,并输出到/var/log/cron.log
#这个路径下的/etc/del_log.sh是后面Dockerfile文件复制过去的
00 03 * * * /etc/del_log.sh >> /var/log/cron.log 2>&1

注意:这个文件要留出空行,否则会报premature EOF错误


3.追加如下命令到Dockerfile中


RUN yum -y install sysstat
RUN yum -y install crontabs
COPY del_log.sh /etc/del_log.sh
COPY root /etc/cron.d/root
COPY root /var/spool/cron
RUN chmod +x /etc/del_log.sh && crontab /etc/cron.d/root
#解决crontab执行权限问题
RUN sed -i "s/required/sufficient/g" /etc/pam.d/crond

这个启动脚本通常在Dockerfile的CMD中被执行,加到最后一行

CMD crontab /etc/root && service crond start && crontab -l


最后,通过tail -f /var/log/cron.log验证定时任务是否执行或者直接看日志是否被删除


这里我也做了一个测试,把删除日志时间改为几分钟后进行了,验证,结果也是OK的


当然这里直接改为凌晨3点执行,第二天验证照样是OK的,不过中间确实走了不少坑,大家有疑问可以留言相互交流

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
打赏
0
0
0
0
9
分享
相关文章
docker load 后镜像名称为空的问题解决
Docker在容器化应用程序时提供了强大的镜像管理功能,但也可能在某些操作中遇到如镜像名称为空的问题。通过理解问题的成因并采取适当的解决方案,如正确保存和加载镜像、手动修复标签等,可以有效避免和解决这一问题。通过本文提供的指导,您可以确保在使用Docker进行镜像操作时更为顺利,并提高容器管理的效率。
158 82
Docker平台上的Redis镜像运行
这就是如何在Docker平台上运行Redis镜像的全部过程。走进Docker和Redis的世界,探索更多可能!
57 10
大模型文件Docker镜像化部署技术详解
大模型文件Docker镜像化部署技术详解
159 2
YashanDB Docker镜像制作
本文介绍了使用Docker部署YashanDB数据库的方法及其优势。相比传统部署方式,Docker简化了环境配置,实现一键部署,确保软件在不同环境中一致运行。文章详细讲解了数据库镜像与容器的概念、Dockerfile的构建流程,以及如何通过Dockerfile定制YashanDB镜像。此外,还演示了镜像的发布过程,包括推送至阿里云容器镜像服务(ACR)。最后,探讨了容器启动时的初始化脚本设置和数据文件复用方法,满足客户对数据库自动化初始化和数据持久化的需求。
《docker基础篇:4.Docker镜像》包括是什么、分层的镜像、UnionFS(联合文件系统)、docker镜像的加载原理、为什么docker镜像要采用这种分层结构呢、docker镜像commit
《docker基础篇:4.Docker镜像》包括是什么、分层的镜像、UnionFS(联合文件系统)、docker镜像的加载原理、为什么docker镜像要采用这种分层结构呢、docker镜像commit
298 70
docker环境安装kafka/Flink/clickhouse镜像
通过上述步骤和示例,您可以系统地了解如何使用Docker Compose安装和配置Kafka、Flink和ClickHouse,并进行基本的验证操作。希望这些内容对您的学习和工作有所帮助。
268 28
Docker Image即Docker镜像
Docker 镜像是 Docker 容器的基础,包含了运行应用程序所需的一切。通过 Dockerfile 可以方便地创建自定义镜像,并且利用 Docker 提供的命令可以轻松管理和使用这些镜像。掌握 Docker 镜像的创建、管理和使用,是进行容器化应用开发和部署的基础技能。希望本文能帮助读者更好地理解 Docker 镜像的概念和操作,提高开发和运维效率。
138 13
多种脚本批量下载 Docker 镜像:Shell、PowerShell、Node.js 和 C#
本项目提供多种脚本(Shell、PowerShell、Node.js 和 C#)用于批量下载 Docker 镜像。配置文件 `docker-images.txt` 列出需要下载的镜像及其标签。各脚本首先检查 Docker 是否安装,接着读取配置文件并逐行处理,跳过空行和注释行,提取镜像名称和标签,调用 `docker pull` 命令下载镜像,并输出下载结果。使用时需创建配置文件并运行相应脚本。C# 版本需安装 .NET 8 runtime。
158 2
docker centos镜像 npm安装包时报错“npm ERR! code ECONNRESET”
通过上述步骤,您可以有效解决在 Docker 中使用 CentOS 镜像安装 npm 包时遇到的 "npm ERR! code ECONNRESET" 错误。希望这些方法能帮助您顺利进行 npm 包的安装。
217 26
Docker-基础(数据卷、自定义镜像、Compose)
通过数据卷实现持久化存储,通过自定义镜像满足特定需求,通过Docker Compose方便地管理多容器应用
118 27