Docker 里跑 alpine 3.18,镜像装了 dcron,entrypoint 脚本里 service crond start 后脚本退出,容器状态 Exited (0),docker logs 里一条 CROND 都没有,换过 nohup 起 crond 也撑不过几秒。

排查方向其实有限,先把可能性排一排。容器的 PID 1 退出容器就结束,后台起的 crond 跟着被杀;镜像里没有 init 进程,孤儿进程不会被收养,僵尸堆积;entrypoint 最后一行不是前台进程,shell 直接返回 0。

第一件事是让 cron 变成前台进程

ENTRYPOINT ["crond","-f","-l","2"]

或者用 supervisor 管两个进程

supervisord -c /etc/supervisord.conf

接着确认容器里进程还在

docker exec -it app ps aux | grep '[c]rond'

等前面都确认过,再看 cron 的执行记录

docker logs -f app | grep CROND

命令输出我都留了记录,免得改完记不清原来的值。

改之前先确认了最近有没有人动过配置,避免白查一遍。

恢复的判定其实很直接。docker ps 里容器 Up 且运行时长持续增长,日志里每隔设定时间出现 CROND 执行记录,任务产物出现在挂载目录。

这里还有个坑。容器里不要用 service 起守护进程,前台化是唯一可靠的方式;任务产物写到挂载卷,否则容器一重建全部丢失。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189