Link Search Menu Expand Document

设置cron

在Linux中定时任务一般使用cron,ubuntu的官方镜像中已经包含了cron,可以直接使用。但是因为cron是后台执行,我们还需要另外一个进程来保持container的运行。 可以通过使用tail -F ,来检测一些log文件保持进程,也可以在container启动的时候设置 -restart alwasy

下面是以ubuntu为例的Dockerfile:

FROM ubuntu:14.04

# 安装python, 这步可以省略,或添加其他依赖
RUN apt-get update
RUN apt-get install -y python

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

# 复制要运行的代码到镜像中,包括cron配置文件
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是要运行的定时任务。关于cron配置,可以参考这篇文章

build镜像

Dockerfile, run.sh, crontabfile 放在脚本跟目录下,运行docker build -t your-image-name .创建镜像。

测试

在脚本根目录下创建run.py脚本来测试镜像。

run.py

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

运行

在有docker engining的机器上运行docker run you-image-name启动定时任务,也可以根据具体情况添加其他启动参数。

代码

文本代码托管在yanqiw/cron-in-docker.

使用如下代码来快速运行代码:

git clone https://github.com/yanqiw/cron-in-docker.git
cd cron-in-docker
docker build -t cron-in-docker .
docker run --rm -it cron-in-docker

container启动后,在控制台可以看到每分钟输出的”I am running by cron”.

参考文章

aptible/docker-cron-example