提到定时任务,第一个想到的肯定是cron。如何在docker中使用cron,请参考这个so上的问题:
今天要介绍的是另一个专门为docker环境设计的任务管理工具:ofelia。github地址:
如它文档所说,这是专门为docker环境设计的,目标是在docker环境中取代cron。ofelia最主要的feature是能够直接在docker镜像内部运行命令。ofelia直接使用docker api,能够模拟docker exec,可以在一个运行中的docker镜像内运行指定命令。
运行定时任务
Ofelia一共支持4种类型的任务:
- job-exec : 在一个处于running状态的容器运行job
[job-exec "job-executed-on-running-container"]schedule = @hourlycontainer = my-containercommand = touch /tmp/example复制代码
在处于running状态的my-container容器中,每隔一个小时运行一次touch /tmp/example
命令。
- job-run : 指定一个镜像,用其创建一个新的容器,然后运行相应指令
[job-run "job-executed-on-new-container"]schedule = @hourlyimage = ubuntu:latestcommand = touch /tmp/example复制代码
使用ubuntu:latest
镜像构建运行的容器。
- job-local:在宿主机上运行
[job-local "job-executed-on-current-host"]schedule = @hourlycommand = touch /tmp/example复制代码
- job-service-run:在swarm种运行
[job-service-run "service-executed-on-new-container"]schedule = 0,20,40 * * * *image = ubuntunetwork = swarm_networkcommand = touch /tmp/example复制代码
同时,ofelia支持丰富的schedule语法,例如:
@every ,比如:
- @every 10m : 每10分钟运行一次
- @every 1h20m15s 每1小时20分15s运行一次
详细请参见https://godoc.org/github.com/robfig/cron 以及cron官方文档。
日志
Ofelai内置了三种日志处理方式:
- mail:发送邮件
- save:保存至文件
- slack:通过slack webhook发送
支持的配置选项有:
- 针对邮件方式:
- smtp-host
- smtp-port
- smtp-user
- smtp-password
- email-to
- email-from
- mail-only-on-error
- 针对日志文件保存方式
- save-folder
- save-only-on-error
- 针对slack webhook:
- slack-webhook
- slack-only-on-error
示例
在宿主机上添加/etc/ofelia/config.ini
文件:
[job-exec "test"]schedule = @every 5mcontainer = yanbao_factory_yanbao_1command = python get_latest_report.pysave-folder = /var/log/yanbao复制代码
然后docker run:
*docker run -it -v /etc/ofelia:/etc/ofelia -v /var/run/docker.sock:/var/run/docker.sock -v /path/to/yanbao/logs:/var/log/yanbao --name ofelia mcuadros/ofelia:latest*复制代码
- -v /etc/ofelia:/etc/ofelia
ofelia容器默认的配置文件为/etc/ofelia/config.ini,所以需要将上面建的这个文件mount到容器内部
- -v /path/to/yanbao/logs:/var/log/yanbao
在配置中文件指定了
save-folder = /var/log/yanbao
所以将这个目录mount到宿主机上。