实现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日志并进行多维度分析。
目录
相关文章
|
14天前
|
Docker 容器
将本地的应用程序打包成Docker镜像
将本地的应用程序打包成Docker镜像
|
15天前
|
数据库 Docker 容器
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。Dockerfile定义了构建镜像所需的所有指令,包括基础镜像选择、软件安装、文件复制等,极大提高了开发和部署的灵活性与一致性。掌握Dockerfile的编写,对于提升软件开发效率和环境管理具有重要意义。
33 9
|
1月前
|
缓存 Linux 网络安全
docker的镜像无法下载如何解决?
【10月更文挑战第31天】docker的镜像无法下载如何解决?
1417 29
|
15天前
|
存储 Prometheus 监控
Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行
本文深入探讨了在Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行。
26 5
|
15天前
|
存储 缓存 运维
Docker镜像采用分层存储,每层代表镜像的一部分,如基础组件或应用依赖,多层叠加构成完整镜像
Docker镜像采用分层存储,每层代表镜像的一部分,如基础组件或应用依赖,多层叠加构成完整镜像。此机制减少存储占用,提高构建和传输效率。Docker还通过缓存机制提升构建和运行效率,减少重复工作。文章深入解析了Docker镜像分层存储与缓存机制,包括具体实现、管理优化及实际应用案例,帮助读者全面理解其优势与挑战。
38 4
|
20天前
|
存储 JSON 网络协议
Docker面试整理-如何查看和管理Docker容器的日志?
通过本文的介绍,我们了解了如何查看和管理Docker容器的日志,包括使用 `docker logs`命令、配置日志驱动、设置日志选项和集中日志管理。掌握这些技能,不仅可以在面试中展示专业水平,也能在实际工作中高效
62 3
|
1月前
|
存储 关系型数据库 Linux
【赵渝强老师】什么是Docker的镜像
Docker镜像是一个只读模板,包含应用程序及其运行所需的依赖环境。镜像采用分层文件系统,每次修改都会以读写层形式添加到原只读模板上。内核bootfs用于加载Linux内核,根镜像相当于操作系统,上方为应用层。镜像在物理存储上是一系列文件的集合,默认存储路径为“/var/lib/docker”。
|
1月前
|
存储 Linux Docker
centos系统清理docker日志文件
通过以上方法,可以有效清理和管理CentOS系统中的Docker日志文件,防止日志文件占用过多磁盘空间。选择合适的方法取决于具体的应用场景和需求,可以结合手动清理、logrotate和调整日志驱动等多种方式,确保系统的高效运行。
36 2
|
1月前
|
存储 监控 Linux
docker构建镜像详解!!!
本文回顾了Docker的基本命令和管理技巧,包括容器和镜像的增删改查操作,容器的生命周期管理,以及如何通过端口映射和数据卷实现容器与宿主机之间的网络通信和数据持久化。文章还详细介绍了如何使用Docker部署一个简单的Web应用,并通过数据卷映射实现配置文件和日志的管理。最后,文章总结了如何制作自定义镜像,包括Nginx、Python3和CentOS镜像,以及如何制作私有云盘镜像。
137 2