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

发布于:2025-08-04 ⋅ 阅读:(13) ⋅ 点赞:(0)

🕒 使用 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 检查容器状态

✅ 技术总结

技术点 简述
cron Linux 定时调度任务工具,支持丰富时间表达式
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 * * * 每两小时

📚 延伸阅读


网站公告

今日签到

点亮在社区的每一天
去签到