在docker容器中使用cron

有时我们需要在容器中使用cron,以dockerfile构建为例。

先看下dockerfile内容:

FROM centos:7  
#安装cron服务
RUN yum install crontabs.noarch -y

#创建脚本路径
RUN mkdir /code  
WORKDIR /code

#复制要运行的代码到镜像中,包括cron配置文件
ADD . /code

#将cron放置到cron.d目录下
RUN cp /code/crontabfile /etc/cron.d/  
RUN touch /var/log/cron.log

#将run.sh设置为可执行
RUN chmod +x /code/run.sh

WORKDIR /code

CMD ["bash","/code/run.sh"]  

crontabfile的内容如下:

* * * * * root /usr/bin/python /code/run.py cron >> /var/log/cron.log 2>&1
* * * * * root /bin/echo 'hello' >> /var/log/cron.log 2>&1

注意,最后一定要一个空行,root是cron执行时的用户,不能省略。

启动脚本run.sh

crond  
touch /var/log/cron.log  
python main.py  

crond是启动cron服务,不能少,最后的python main.py是用于启动一个进程,注意,这个进程一定要在前台进程,不然docker就不知道要帮你管理什么进程了,main.py的内容如下:

import sys, os, time

if __name__ == '__main__':  
    while 1:
        print "daemon"
        time.sleep(10)

看到内容大家就明白了,就是一个死循环程序,实际中这个脚本可以换成httpd服务的进程。

执行的的python程序如下:run.py

if __name__ == '__main__':  
    print "I am runing by cron."

在新浪云创建一个应用,选择自定义运行环境,dockerfile分类,用git客户端上传所有的代码即可。

一键打包下载:http://sinacloud.net/opensource/cron/testcron.zip

进入容器后查看日志就可以看到cron执行的输出了:

[root@testcron /var/log]# tail -f cron.log 
hello  
I am runing by cron.  
hello  
I am runing by cron.  
hello  
I am runing by cron.  
hello  
I am runing by cron.  
hello  
I am runing by cron.