提到定时任务,第一个想到的肯定是cron。如何在docker中使用cron,请参考这个so上的问题:https://stackoverflow.com/questions/37458287/how-to-run-a-cron-job-inside-a-docker-container
今天要介绍的是另一个专门为docker环境设计的任务管理工具:ofelia。github地址:https://github.com/mcuadros/ofelia。
如它文档所说,这是专门为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 = @hourly
container = my-container
command = touch /tmp/example
在处于running状态的my-container容器中,每隔一个小时运行一次 touch/tmp/example
命令。
job-run : 指定一个镜像,用其创建一个新的容器,然后运行相应指令
[job-run "job-executed-on-new-container"]
schedule = @hourly
image = ubuntu:latest
command = touch /tmp/example
使用 ubuntu:latest
镜像构建运行的容器。
job-local:在宿主机上运行
[job-local "job-executed-on-current-host"]
schedule = @hourly
command = touch /tmp/example
job-service-run:在swarm种运行
[job-service-run "service-executed-on-new-container"]
schedule = 0,20,40 * * * *
image = ubuntu
network = swarm_network
command = 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 5m
container = yanbao_factory_yanbao_1
command = python get_latest_report.py
save-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到宿主机上。