創建過程
基礎鏡像采用的centos7.2,需要安裝一下crontab,在dockerfile中加以下語句就可以了:
# crontab jobs
RUN yum -y install crontabs
ADD ./run/nlp-cron /etc/cron.d/nlp-cron
RUN chmod 0644 /etc/cron.d/nlp-cron
RUN crontab /etc/cron.d/nlp-cron
其中nlp-cron是定時任務的配置,內容是下面這樣的:
* * * * * sh test.sh >/dev/null 2>&1
后來啟動了鏡像,發現定時任務並不能正常啟動,於是開啟了漫長的排錯過程。
排錯1
首先進入docker的容器,用crontab -l
看了一下,任務實際上是存在的,可以證明是任務沒有啟動/執行成功而已。
同時在容器中,執行了一下想要做的操作,發現沒有任何問題,說明代碼沒有問題。
排錯2
創建鏡像的過程是參考這里做的,按理說不缺什么步驟,於是又按照他的過程重新弄了一下,發現系統命令可以執行。
此時又問了一下同事,說最好用全路徑。我本身執行的是python命令,於是whereis python
找了一下全路徑,改了之后,發現還是沒有執行成功。
於是在py文件里加了各種print,發現一個問題寫文件的操作不能執行……經同事提醒,試了一下全路徑,居然改好了。
排錯3
過了2天,功能完善后,想打包再試一下,發現又不行了……這次日志顯示的是缺一個環境變量,於是找了半天辦法。最終,在bash_profile中添加了環境變量,才解決了這個問題。
export LD_LIBRARY_PATH=/usr/lib/xxx:$LD_LIBRARY_PATH
export PATH
排錯4
在排錯期間,網上很多人說到是權限驗證的問題。要改下面這個地方,/etc/pam.d/crond:
#
# The PAM configuration file for the cron daemon
#
#
# No PAM authentication called, auth modules not needed
account required pam_access.so
account include password-auth
session sufficient pam_loginuid.so
session include password-auth
auth include password-auth
排錯5
打包之后,起了容器,可能還會遇到不執行的問題,此時可以嘗試重啟crontab。試了一下在dockerfile中加 RUN crond restart
,發現不管用。
此時可以嘗試起了容器之后,執行一個下面的命令:
docker exec -it container_id crond restart