在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
RUN crontab /code/crontabfile
RUN apt-get -y install rsyslog
RUN cp /code/crontabfile /etc/crontab
RUN touch /var/log/cron.log
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
是要运行的定时任务。
将 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
启动定时任务,也可以根据具体情况添加其他启动参数。