用途:在 Kamal 部署中运行周期性、计划性或 cron 任务。Kamal 没有专门的 cron 命令,做法是在 servers: 下定义一个 cron 角色,用独立容器在前台运行系统 cron 守护进程(cron -f),计划来自应用内的 config/crontab 文件。该容器使用与应用相同的镜像,因此应用代码和二进制可用;它运行在指定主机上,独立于 Web 服务器,且不是主角色,默认不经过 Kamal 代理。
主要能力与用法:在仓库中创建 config/crontab,使用标准 Unix cron 语法编写任务,每行在应用容器内执行,需提交该文件使其进入镜像。在 config/deploy.yml 的 servers: 下添加 cron 角色,指定 hosts 和启动命令:bash -c "(env && cat config/crontab) | crontab - && cron -f"。该命令先输出容器环境变量,再拼接 crontab 内容并安装,最后前台运行 cron。由于 cron 不会自动传递环境变量,必须通过 env 把任务所需变量(含 secret,来自 .kamal/secrets)配置到容器中。部署用 kamal deploy;仅更新 cron 角色可用 kamal deploy --roles cron。验证用 kamal details 查看容器,用 kamal app exec --reuse --roles cron 'crontab -l' 查看已安装的 crontab。
适用场景:需要夜间清理、定时刷新报表等周期性任务,且应用已用 Kamal 部署。
限制与注意:修改 config/crontab 后必须重新部署新版本才生效;若启动命令缺少 (env && ...) 部分,任务将没有环境变量;若 config/crontab 未进入镜像则不会有任何计划;启动命令需保留前台进程,否则容器会立即退出。若 servers: 目前是纯主机列表,需先改为命名角色才能添加 cron。官方文档为 Cron configuration。