最近弄了一天基于Debian的docker,耗费了大量时间调试crontab,一直无法运行,多次查询debian官方文档和stack overflow终于找到解决方案,现将弯路记录如下。
和之前alpine和centOS的docker不同,debian使用另一种cron机制,其中要点如下:
1. docker的container环境变量无法带入cron,也不能使用alpine的. /etc/profile进行手工加载,需要使用cat命令进行链接。
2. cron脚本中,相对路径经常出现not found的情况,cron脚本中运行的.sh脚本也一样,具体原因未查明,但是使用绝对路径,即可以。
3. 直接将文件拷贝到/etc/cron.d下面即可,无需再像alpine一样cat到/var/spool/crontab/root下运行。
简要记录遇到问题:
1. cron文件读取异常,使用rsyslog查看cron系统日志,发现是每行结尾多了^M字符,使用dos2unix工具重新转换,解决。
2. 命令不存在 command not found,将路径修改为绝对路径,修改如下。
sh /usr/local/bin/send_mail.sh >> /build/logs/cron_stat.log 2>&1
/bin/bash /usr/local/bin/send_mail.sh >> /build/logs/cron_stat.log 2>&1
其中/usr/local/bin/send_mail.sh脚本修改
#!/bin/sh /usr/local/bin/python /build/monitor_punish.py
#!/bin/bash
cd /build
/usr/local/bin/python monitor_punish.py
3. 修改完毕后python可以运行了,但是报环境变量不存在,但是export和env都有内容,需要提前把内容cat到一个文件中,运行程序时再读文件。
相关文章http://dev.im-bot.com/docker-cron/
Dockerfile修改以下代码:
CMD env > /root/env.txt && cron && python server.py
cron文件修改如下:
*/1 * * * * root env - `cat /root/env.txt` /bin/bash /usr/local/bin/intel_ir_send_punish_mail.sh >> /build/logs/cron_stat.log 2>&1
至此,文件不存在,命令不存在,环境变量不存在,均解决。