今天聊下在docker怎么合理的使用crontab 。
一直没有注意在docker如何使用crontab计划任务,我曾经已经不能用,所以用的是dockerfile定义的启动脚本,里面含有一个while的循环逻辑。
Docker crontab的使用 , http://xiaorui.cc/?p=1875
下面是一个简单的Dockerfile文件
#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
sleep1
export PYTHONPATH=`pwd` && python bin/spider
while true;do
sleep 3;
xxxxxxx;
done;
但是如果你的crontab多的话,就不好处理了,你要写不同的sleep sec ? 这个适用于比较少的计划任务,很是随意。
后来因为我这开发了一个关于业务数据预警的服务,我在服务里面加入了crontab的逻辑。 这里用的是python下的crontab模块。
#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
#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
crontab 只能给予单台node节点,可以考虑rundeck