今天聊下在docker怎麼合理的使用crontab 。
一直沒有注意在docker如何使用crontab計劃任務,我曾經已經不能用,所以用的是dockerfile定義的啓動腳本,裏面含有一個while的循環邏輯。
Docker crontab的使用 , http://xiaorui.cc/?p=1875
下面是一個簡單的Dockerfile文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #xiaorui.cc #拉取鏡像 FROM wowuwowuwo/spider_base COPY ./spider /data/buzzMaster # Define working directory. WORKDIR /data/buzzMaster/ # Clean up RUN rm -rf /tmp/* ENTRYPOINT ["/data/buzzMaster/entrypoint.sh"] #ENTRYPOINT ["echo", "welcome to spider container"] # Define default command. CMD ["bash"] |
在啓動的腳本里面實現crontab的邏輯。
|
#!/bin/sh
export
PYTHONPATH=`pwd`
&&
python
bin/timer
echo
$1
sleep
$1
export
PYTHONPATH=`pwd`
&&
python
bin/spider
while
true;do
sleep
3;
xxxxxxx;
done;
|
但是如果你的crontab多的話,就不好處理了,你要寫不同的sleep sec ? 這個適用於比較少的計劃任務,很是隨意。
後來因爲我這開發了一個關於業務數據預警的服務,我在服務裏面加入了crontab的邏輯。 這裏用的是python下的crontab模塊。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #coding:utf-8 import time from datetime import datetime from crontab import CronTab from buzz.lib.config import config task_entry = CronTab(config.get('task_crontab','monitor')) clean_entry = CronTab(config.get('clean_crontab','monitor')) def task_cron_match(): delay_time = task_entry.next(datetime.now()) print delay_time if delay_time < 1: time.sleep(1) return True return None def clean_cron_match(): delay_time = clean_entry.next(datetime.now()) if delay_time < 1: time.sleep(1) return True return None if __name__=="__main__": print task_cron_match() print clean_cron_match() |
config.ini 的配置信息是這樣的,跟系統的crontab格式是一樣的。 執行的時候,一個任務一個線程,不會因爲某個任務堵塞超時,造成其他的任務不能準時的執行。
|
task_crontab
=
2
*
*
*
*
clean_crontab
=
30
1
*
*
*
|
後來在StackOverflow看到有人說,docker下是支持crontab的。 特麼的…….
| ADD crontab /var/spool/cron/xiaorui/nima CMD cron -f |
編輯可用的crontab文件。
vim crontab
*/1 * * * * root echo “Hello world” >> /var/log/cron.log 2>&1
*/1 * * * * root echo $(date) >> /var/log/cron.log 2>&1
*/1 * * * * root echo “1111″ >> /var/log/cron.log 2>&1
*/1 * * * * root echo $(date +\%T) >> /var/log/cron.log 2>&1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#xiaorui.cc
FROM
ubuntu:latest
MAINTAINER
rfyiamcool@163.com
ADD
crontab
/etc/cron.d/hello-cron
RUN
echo
xiaorui.cc
RUN
chmod
0644
/etc/cron.d/hello-cron
RUN
touch
/var/log/cron.log
CMD
cron
&&
tail
-f
/var/log/cron.log
|
構建含有crontab的docker image鏡像。
sudo docker build –rm -t xiaorui.cc/docker-crontab .
啓動這個容器。
sudo docker run -t -i xiaorui.cc/docker-crontab
過兩分鐘我們會看到,容器輸出的日誌.
Hello world
Hello world