1. 程式人生 > >基於Debian映象的Docker,crontab無法正常執行的配置筆記

基於Debian映象的Docker,crontab無法正常執行的配置筆記

最近弄了一天基於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到一個檔案中,執行程式時再讀檔案。

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

至此,檔案不存在,命令不存在,環境變數不存在,均解決。