tgbyte/cronDockerized Cron 是一个轻量级 Docker 镜像,旨在将 Unix/Linux 系统中的 cron 守护进程容器化,提供在隔离环境中执行定时任务的能力。该镜像基于 Alpine Linux 构建,保持极小体积的同时,完整支持 cron 任务调度功能,适用于需要在容器环境中运行周期性任务的场景。
docker logs 查看bash# 1. 创建本地 crontab 文件(示例:每分钟输出当前时间到日志) echo "* * * * * echo 'Current time: \$(date)' >> /var/log/cron.log 2>&1" > ./my-crontab # 2. 运行容器,挂载 crontab 文件至容器内默认路径 docker run -d \ --name docker-cron \ -v $(pwd)/my-crontab:/etc/crontabs/root \ # 挂载自定义 crontab(root 用户任务) -v $(pwd)/cron-logs:/var/log \ # 挂载日志目录(可选,持久化日志) -e TZ=Asia/Shanghai \ # 设置时区(默认 UTC) dockerized-cron:latest
root 用户执行任务,crontab 文件需挂载至 /etc/crontabs/root(Alpine crond 标准路径)>> /path/to/log 2>&1 重定向至文件,或直接输出到 stdout(通过 docker logs 查看)容器内 crontab 文件语法与标准 cron 一致,格式如下:
plaintext# 分钟 小时 日 月 星期 命令/脚本(支持绝对路径) # 取值范围: # 分钟 (0-59), 小时 (0-23), 日 (1-31), 月 (1-12), 星期 (0-6, 0=周日) # 特殊符号:*(任意值)、/(间隔)、,(枚举)、-(范围) # 示例任务: */5 * * * * /usr/local/bin/backup.sh # 每 5 分钟执行备份脚本 0 3 * * * /usr/local/bin/clean-logs.sh # 每天凌晨 3 点执行日志清理 0 0 * * 0 /usr/local/bin/weekly-report.sh # 每周日凌晨 0 点生成周报
| 环境变量 | 说明 | 默认值 | 可选值示例 |
|---|---|---|---|
TZ | 容器时区(影响任务执行时间) | UTC | Asia/Shanghai、UTC+8 |
CRON_USER | 执行任务的用户(容器内用户) | root | appuser(需提前创建) |
CRON_LOG_LEVEL | 日志级别 | info | debug、warn、error |
bash# 实时查看容器日志(包含 cron 守护进程日志与任务输出) docker logs -f docker-cron
bash# 将容器内 /var/log 挂载至本地目录,持久化任务日志 docker run -d \ --name docker-cron \ -v $(pwd)/my-crontab:/etc/crontabs/root \ -v $(pwd)/cron-logs:/var/log \ # 本地目录 cron-logs 会保存任务日志 dockerized-cron:latest
yamlversion: '3.8' services: cron: image: dockerized-cron:latest container_name: app-cron restart: unless-stopped # 任务持久化,容器退出后自动重启 environment: - TZ=Asia/Shanghai # 设置时区为上海 - CRON_USER=appuser # 非 root 用户执行任务(需确保容器内存在该用户) volumes: - ./crontabs:/etc/crontabs # 挂载整个 crontabs 目录(支持多用户任务) - ./scripts:/usr/local/scripts # 挂载任务依赖的脚本(如备份脚本) - ./cron-logs:/var/log # 持久化日志 # 可选:限制资源占用 deploy: resources: limits: cpus: '0.1' memory: 64M
| 路径 | 说明 | 挂载建议 |
|---|---|---|
/etc/crontabs/root | 默认 crontab 文件(root 用户任务) | 挂载本地文件至该路径 |
/etc/crontabs | 多用户 crontab 目录(用户任务文件) | 挂载目录,按用户名存放任务文件 |
/etc/cron.d | 系统级任务目录(支持任意文件名) | 挂载目录,存放系统级任务配置 |
若任务依赖外部脚本或工具,需通过卷挂载或镜像构建阶段集成:
bash# 示例:挂载本地脚本目录至容器,任务中调用脚本 docker run -d \ -v $(pwd)/my-crontab:/etc/crontabs/root \ -v $(pwd)/my-scripts:/usr/local/scripts \ # 本地脚本目录挂载至容器 dockerized-cron:latest
此时 crontab 文件可直接调用脚本:
bash# 每小时执行挂载的备份脚本 0 * * * * /usr/local/scripts/backup-data.sh >> /var/log/backup.log 2>&1
容器默认时区为 UTC,若任务需按本地时区执行,需通过以下方式配置:
TZ 配置(推荐)bashdocker run -e TZ=Asia/Shanghai dockerized-cron:latest
bashdocker run -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro dockerized-cron:latest
权限问题:
600)任务输出处理:
vim)>> /var/log/task.log 2>&1),否则可能丢失日志容器生命周期:
--restart=always 或 docker-compose restart 策略确保任务持续执行资源限制:
--cpus、--memory 限制容器资源,避免影响其他服务A:1. 检查 crontab 文件语法(可通过 crontab -l 在容器内验证);2. 查看容器日志(docker logs)确认 cron 守护进程是否正常启动;3. 确认任务命令在容器内可执行(如依赖工具是否存在)。
A:需在 crontab 文件中显式定义环境变量,或通过 source /etc/environment 加载容器环境变量,例如:
bash# 在 crontab 文件中定义环境变量 DB_HOST=db.example.com DB_PORT=3306 * * * * * /usr/local/scripts/query-db.sh $DB_HOST $DB_PORT >> /var/log/db.log 2>&1
A:修改本地挂载的 crontab 文件后,无需重启容器,cron 守护进程会自动检测文件变更(通常 1-2 分钟内生效);若未自动生效,可通过 docker exec docker-cron crontab /etc/crontabs/root 手动重载。


manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务