> 技术文档 > 使用 cron 配合 Docker 实现定时任务_自动化运维定时脚本

使用 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/bashecho \"$(date) I am alive from container\" >> /log/output.log\' > myscript.shchmod +x myscript.sh
  3. 创建 Dockerfile

    FROM ubuntu:20.04RUN apt-get update && apt-get install -y bashWORKDIR /appCOPY myscript.sh .CMD [\"tail\", \"-f\", \"/dev/null\"]

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

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

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

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

  1. 安装 cron

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

    sudo systemctl enable cronsudo 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 containerTue 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表达式每一位含义
* * * * * ┬ ┬ ┬ ┬ ┬│ │ │ │ ││ │ │ │ └─── 星期几 (0-7) 0和7均为周日│ │ │ └───── 月份 (1-12)│ │ └─────── 日 (1-31)│ └───────── 小时 (0-23)└─────────── 分钟 (0-59)
  • cron 表达式特殊含义参考:
表达式 含义 * * * * * 每分钟 */5 * * * * 每 5 分钟 0 0 * * * 每天 0 点 0 */2 * * * 每两小时

📚 延伸阅读

  • crontab Guru:在线 cron 表达式解释工具
  • Docker 官方文档