在docker container中启动定时任务
来自: http://dockone.io/article/1070
设置cron
在Linux中定时任务一般使用cron,ubuntu的官方镜像中已经包含了cron,可以直接使用。但是因为cron是后台执行,我们还需要另外一个进程来保持container的运行。 可以通过使用 tail -F ,来检测一些log文件保持进程,也可以在container启动的时候设置 -restart alwasy 。
下面是以ubuntu为例的 Dockerfile :
FROM ubuntu:14.04
创建脚本路径
RUN mkdir /code
WORKDIR /code
ONBUILD ADD . /code
设置cron脚本
RUN crontab /code/crontabfile
安装rsyslog
RUN apt-get -y install rsyslog
复制crontabfile到/etc/crontab
RUN cp /code/crontabfile /etc/crontab
RUN touch /var/log/cron.log
将run.sh设置为可执行
RUN chmod +x /code/run.sh
WORKDIR /code
CMD ["bash","/code/run.sh"]
run.sh
rsyslogd cron touch /var/log/cron.log tail -F /var/log/syslog /var/log/cron.log
tail -F /var/log/syslog /var/log/cron.log 这里用来输出系统和cron日志,并保持container运行。
crontabfile example
0 23 * * * python /code/run.py cron >> /var/log/cron.log 2>&1
python /code/run.py 是要运行的定时任务。
build镜像
将 Dockerfile , run.sh , crontabfile 放在脚本跟目录下,运行 docker build -t your-image-name . 创建镜像。
测试
在脚本根目录下创建 run.py 脚本来测试镜像。
run.py
if __name__ == '__main__': print "I am runing by crontab"
运行
在有docker engining的机器上运行 docker run you-image-name 启动定时任务,也可以根据具体情况添加其他启动参数。