使用 cron 配合 Docker 实现定时任务_自动化运维定时脚本
🕒 使用 cron
配合 Docker 实现定时任务
个人大白话总结
就是一个服务器的定时任务工具,只要在一个配置文档中写好所有任务的触发时间以及命令(以及脚本),就能自动执行了。
📌 一、什么是 cron
cron
是 Unix/Linux 系统下的定时任务调度工具,用于在指定时间点执行某些命令或脚本。常见的使用场景包括:
- 定时备份数据库
- 定时发送邮件或通知
- 每小时或每天同步数据
- 调度运行某些脚本或命令(比如数据抓取、清理任务等)
📦 二、结合 Docker 的场景
在现代应用中,我们经常将服务封装进 Docker 容器中。结合 cron
与 docker exec
,我们可以在宿主机上定时调度容器内部的任务:
✅ 定时运行容器内脚本
✅ 管理日志输出
✅ 统一由宿主机调度,避免容器内独立维护 cron 服务
⚙️ 三、完整实践案例:使用 cron
定时执行容器内脚本
🎯 目标
每分钟执行一次容器内脚本 myscript.sh
,记录一句 “I am alive” 到日志中。
🔨 步骤 1:准备 Docker 镜像与容器
-
创建项目目录:
mkdir ~/cron-docker-demo && cd ~/cron-docker-demo
-
编写脚本文件
myscript.sh
:echo \'#!/bin/bashecho \"$(date) I am alive from container\" >> /log/output.log\' > myscript.shchmod +x myscript.sh
-
创建
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脚本正常),我们这里需要加一行这个。 -
构建镜像并运行容器:
docker build -t cron-demo .mkdir ~/cron-docker-logsdocker run -d --name cron-demo-container -v ~/cron-docker-logs:/log cron-demo
📅 步骤 2:安装并配置 cron
(在宿主机)
-
安装
cron
:sudo apt updatesudo apt install cron -y
-
启动并设置为开机启动:
sudo systemctl enable cronsudo systemctl start cron
-
编辑用户的定时任务:
crontab -e
添加以下内容(每分钟执行):
* * * * * docker exec cron-demo-container /app/myscript.sh
-
保存退出,
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 [\"tail\", \"-f\", \"/dev/null\"]
写法正确cron
不生效cron
服务sudo systemctl start cron
chmod +x
,并检查是否有权限访问日志路径docker exec
无法运行docker ps
检查容器状态✅ 技术总结
cron
crontab
docker exec
CMD [\"tail\", \"-f\", \"/dev/null\"]
-v
- cron表达式每一位含义
* * * * * ┬ ┬ ┬ ┬ ┬│ │ │ │ ││ │ │ │ └─── 星期几 (0-7) 0和7均为周日│ │ │ └───── 月份 (1-12)│ │ └─────── 日 (1-31)│ └───────── 小时 (0-23)└─────────── 分钟 (0-59)
cron
表达式特殊含义参考:
* * * * *
*/5 * * * *
0 0 * * *
0 */2 * * *
📚 延伸阅读
- crontab Guru:在线 cron 表达式解释工具
- Docker 官方文档