当前位置: 首页 > news >正文

使用 cron 配合 Docker 实现定时任务

🕒 使用 cron 配合 Docker 实现定时任务

个人大白话总结

就是一个服务器的定时任务工具,只要在一个配置文档中写好所有任务的触发时间以及命令(以及脚本),就能自动执行了。

📌 一、什么是 cron

cron 是 Unix/Linux 系统下的定时任务调度工具,用于在指定时间点执行某些命令或脚本。常见的使用场景包括:

  • 定时备份数据库
  • 定时发送邮件或通知
  • 每小时或每天同步数据
  • 调度运行某些脚本或命令(比如数据抓取、清理任务等)

📦 二、结合 Docker 的场景

在现代应用中,我们经常将服务封装进 Docker 容器中。结合 crondocker exec,我们可以在宿主机上定时调度容器内部的任务:

✅ 定时运行容器内脚本
✅ 管理日志输出
✅ 统一由宿主机调度,避免容器内独立维护 cron 服务


⚙️ 三、完整实践案例:使用 cron 定时执行容器内脚本

🎯 目标

每分钟执行一次容器内脚本 myscript.sh,记录一句 “I am alive” 到日志中。

🔨 步骤 1:准备 Docker 镜像与容器

  1. 创建项目目录:

    mkdir ~/cron-docker-demo && cd ~/cron-docker-demo
    
  2. 编写脚本文件 myscript.sh

    echo '#!/bin/bash
    echo "$(date) I am alive from container" >> /log/output.log' > myscript.sh
    chmod +x myscript.sh
    
  3. 创建 Dockerfile

    FROM ubuntu:20.04
    RUN apt-get update && apt-get install -y bash
    WORKDIR /app
    COPY myscript.sh .
    CMD ["tail", "-f", "/dev/null"]
    

    至于为什么最后一行写CMD ["tail", "-f", "/dev/null"]是因为这是测试用的容器,除了脚本没有其他运行的前后台程序,如果容器中没有运行的程序,容器会停止。为了防止容器停止(以便后续进入容器运行sh脚本正常),我们这里需要加一行这个。

  4. 构建镜像并运行容器:

    docker build -t cron-demo .
    mkdir ~/cron-docker-logs
    docker run -d --name cron-demo-container -v ~/cron-docker-logs:/log cron-demo
    

📅 步骤 2:安装并配置 cron(在宿主机)

  1. 安装 cron

    sudo apt update
    sudo apt install cron -y
    
  2. 启动并设置为开机启动:

    sudo systemctl enable cron
    sudo systemctl start cron
    
  3. 编辑用户的定时任务:

    crontab -e
    

    添加以下内容(每分钟执行):

    * * * * * docker exec cron-demo-container /app/myscript.sh
    
  4. 保存退出,cron 会自动应用此任务。


🔍 步骤 3:查看执行结果

一分钟后检查日志输出:

cat ~/cron-docker-logs/output.log

输出示例:

Tue Jul 30 18:32:01 UTC 2025 I am alive from container
Tue Jul 30 18:33:01 UTC 2025 I am alive from container

❗ 常见问题排查

问题可能原因解决方法
Exited (127)容器 CMD 写法错误确保 CMD ["tail", "-f", "/dev/null"] 写法正确
cron 不生效没安装或未启动 cron 服务执行 sudo systemctl start cron
脚本无输出权限不足,未执行成功给脚本加上 chmod +x,并检查是否有权限访问日志路径
docker exec 无法运行容器未启动或已退出docker ps 检查容器状态

✅ 技术总结

技术点简述
cronLinux 定时调度任务工具,支持丰富时间表达式
crontab用户级的任务列表编辑工具
docker exec在运行中的容器中执行命令
CMD ["tail", "-f", "/dev/null"]保持容器长时间运行的常用写法
挂载卷 -v用于将容器日志映射到宿主机,便于持久化与查看
  • cron表达式每一位含义
* * * * * <command>
┬ ┬ ┬ ┬ ┬
│ │ │ │ │
│ │ │ │ └─── 星期几 (0-7) 0和7均为周日
│ │ │ └───── 月份 (1-12)
│ │ └─────── 日 (1-31)
│ └───────── 小时 (0-23)
└─────────── 分钟 (0-59)
  • cron 表达式特殊含义参考:
表达式含义
* * * * *每分钟
*/5 * * * *每 5 分钟
0 0 * * *每天 0 点
0 */2 * * *每两小时

📚 延伸阅读

  • crontab Guru:在线 cron 表达式解释工具
  • Docker 官方文档
http://www.dtcms.com/a/307028.html

相关文章:

  • 神经网络的并行计算与加速技术
  • 模型相关类代码回顾理解 | BatchNorm2d\fc.in_features\nn.Linear\torchsummary
  • Haproxy 七层代理深度解析
  • Ubuntu 本地部署和使用 n8n 指南and ai almost anything
  • REST、GraphQL、gRPC、tRPC深度对比
  • Python Day19 时间模块 和 json模块 及例题分析
  • Dify案例2:基于Workflow的小红书笔记AI智能体以及AI绘图过程中遇到的问题
  • USRP捕获手机/路由器数据传输信号波形(上)
  • Vue面试
  • HTML基础P2 | JS基础讲解
  • 《汇编语言:基于X86处理器》第10章 复习题和练习
  • HTTPS基本工作过程:基本加密过程
  • 谈谈毕业工作一年后的变化
  • c#_文件的读写 IO
  • 关系型数据库架构最优选择:基于落霞归雁思维框架的分析
  • 7月30日作业
  • Spring Boot 数据源配置中为什么可以不用写 driver-class-name
  • 第六章第一节 TIM 定时中断
  • vue2中的过滤器filter
  • 1+1>2!特征融合如何让目标检测更懂 “场景”?
  • 深入理解数据库事务:从概念到实践
  • 防止飞书重复回调通知分布式锁
  • 白话容器基础(一):进程
  • Mybatis分页查询当前页数据条数大于实际返回的数据条数
  • 拥抱智慧物流时代:数字孪生技术的应用与前景
  • Matplotlib(四)- 图表样式美化
  • Linux日志管理和时钟同步配置指南
  • OneCode3.0 框架深入研究与应用扩展
  • html页面跳转或者a标签锚点跳转,解决页面滚动问题3个(1.从底部开始滚动,2.滚动不到指定锚点位置,3.页面展示不在最上面)
  • MySQL图解索引篇(2)