实现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模拟数据,通过数据加工对数据进行清洗并归档至OSS中进行存储。
目录
相关文章
|
24天前
|
应用服务中间件 nginx 开发者
从 Docker Hub 拉取镜像受阻?这些解决方案帮你轻松应对
最近一段时间 Docker 镜像一直是 Pull 不下来的状态,感觉除了挂🪜,想直连 Docker Hub 是几乎不可能的。更糟糕的是,很多原本可靠的国内镜像站,例如一些大厂和高校运营的,也陆续关停了,这对我们这些个人开发者和中小企业来说是挺难受的。之前,通过这些镜像站,我们可以快速、方便地获取所需的 Docker 镜像,现在这条路也不行了。感觉这次动作不小,以后想直接访问 Docker Hub 是不可能了。所以我们得想办法搭建自己的私有镜像仓库。
从 Docker Hub 拉取镜像受阻?这些解决方案帮你轻松应对
|
17天前
|
JavaScript 前端开发 数据安全/隐私保护
阿里云云效操作报错合集之流水线中获取不到CI_COMMIT_REF_NAME变量,导致docker镜像打包失败,什么原因
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
3天前
|
存储 缓存 安全
Docker 如何管理镜像?
【7月更文挑战第11天】
14 0
Docker 如何管理镜像?
支付系统40------定时查单-订单未创建,支付宝登陆前在支付宝端创建还是没有创建,不知道,之所以打印警告日志,是因为创建的时候更容易看到它
支付系统40------定时查单-订单未创建,支付宝登陆前在支付宝端创建还是没有创建,不知道,之所以打印警告日志,是因为创建的时候更容易看到它
|
19天前
|
应用服务中间件 Linux nginx
详细解读docker国内镜像源docker镜像大全
详细解读docker国内镜像源docker镜像大全
461 0
|
25天前
|
Java Docker 容器
使用 Spring Boot 构建 Docker 镜像并进行多模式部署
使用 Spring Boot 构建 Docker 镜像并进行多模式部署
83 2
|
26天前
|
数据安全/隐私保护 开发者 Docker
国内docker公开镜像站的关闭!别急,docker_image_pusher 使用Github Action将国外的Docker镜像转存到阿里云私有仓库
通过使用 docker_image_pusher 这样的开源项目,我们能够轻松地解决国内访问 Docker 镜像拉取速度慢及拉去失败的问题,同时保证了镜像的稳定性和安全性。利用 Github Action 的自动化功能,使得这一过程更加简单和高效。
775 2
|
10天前
|
Linux Docker 容器
Docker02--搭建Linux环境,配置Docker,docker images无法访问,因为docker没有启动,阿里云镜像加速器免费的
Docker02--搭建Linux环境,配置Docker,docker images无法访问,因为docker没有启动,阿里云镜像加速器免费的
|
11天前
|
缓存 Ubuntu Docker
怎么减小Docker的镜像体积?
**Docker 镜像优化目标:**提升构建速度、减小镜像大小、增强安全性和效率。**技巧:**1) 选择轻量级基础镜像(如Alpine、Ubuntu Minimal);2) 使用多阶段构建,分阶段复制文件和执行操作;3) 利用缓存加速构建,避免不必要的重复;4) 合并`RUN`指令减少镜像层数。这些方法能显著优化镜像,提高性能和节省存储空间。
|
1月前
|
存储 持续交付 数据安全/隐私保护
实现镜像管理轻松搞定:Docker 仓库管理详解
实现镜像管理轻松搞定:Docker 仓库管理详解
300 1