使用 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/bash echo "$(date) I am alive from container" >> /log/output.log' > myscript.sh chmod +x myscript.sh
-
创建
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脚本正常),我们这里需要加一行这个。 -
构建镜像并运行容器:
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
(在宿主机)
-
安装
cron
:sudo apt update sudo apt install cron -y
-
启动并设置为开机启动:
sudo systemctl enable cron sudo 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 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 * * * | 每两小时 |
📚 延伸阅读
- crontab Guru:在线 cron 表达式解释工具
- Docker 官方文档