今天聊下在docker怎么合理的使用crontab 。
一直没有注意在docker如何使用crontab计划任务,我曾经已经不能用,所以用的是dockerfile定义的启动脚本,里面含有一个while的循环逻辑。
Docker crontab的使用 , http://xiaorui.cc/?p=1875
下面是一个简单的Dockerfile文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#xiaorui.cc
#拉取镜像
FROM
wowuwowuwo
/
spider_base
COPY
.
/
spider
/
data
/
buzzMaster
# Define working directory.
WORKDIR
/
data
/
buzzMaster
/
# Clean up
RUN
rm
-
rf
/
tmp
/
*
ENTRYPOINT
[
"/data/buzzMaster/entrypoint.sh"
]
#ENTRYPOINT ["echo", "welcome to spider container"]
# Define default command.
CMD
[
"bash"
]
|
在启动的脚本里面实现crontab的逻辑。
1
2
3
4
5
6
7
8
9
10
|
#!/bin/sh
export
PYTHONPATH
=
`
pwd
`
&&
python
bin
/
timer
echo
$
1
sleep
$
1
export
PYTHONPATH
=
`
pwd
`
&&
python
bin
/
spider
while
true
;
do
sleep
3
;
xxxxxxx
;
done
;
|
但是如果你的crontab多的话,就不好处理了,你要写不同的sleep sec ? 这个适用于比较少的计划任务,很是随意。
后来因为我这开发了一个关于业务数据预警的服务,我在服务里面加入了crontab的逻辑。 这里用的是python下的crontab模块。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
#coding:utf-8
import
time
from
datetime
import
datetime
from
crontab
import
CronTab
from
buzz
.
lib
.
config
import
config
task_entry
=
CronTab
(
config
.
get
(
'task_crontab'
,
'monitor'
)
)
clean_entry
=
CronTab
(
config
.
get
(
'clean_crontab'
,
'monitor'
)
)
def
task_cron_match
(
)
:
delay_time
=
task_entry
.
next
(
datetime
.
now
(
)
)
print
delay_time
if
delay_time
<
1
:
time
.
sleep
(
1
)
return
True
return
None
def
clean_cron_match
(
)
:
delay_time
=
clean_entry
.
next
(
datetime
.
now
(
)
)
if
delay_time
<
1
:
time
.
sleep
(
1
)
return
True
return
None
if
__name__
==
"__main__"
:
print
task_cron_match
(
)
print
clean_cron_match
(
)
|
config.ini 的配置信息是这样的,跟系统的crontab格式是一样的。 执行的时候,一个任务一个线程,不会因为某个任务堵塞超时,造成其他的任务不能准时的执行。
1
2
3
|
task_crontab
=
2
*
*
*
*
clean_crontab
=
30
1
*
*
*
|
后来在StackOverflow看到有人说,docker下是支持crontab的。 特么的…….
1
2
3
|
ADD
crontab
/
var
/
spool
/
cron
/
xiaorui
/
nima
CMD
cron
-
f
|
编辑可用的crontab文件。
vim crontab
*/1 * * * * root echo “Hello world” >> /var/log/cron.log 2>&1
*/1 * * * * root echo $(date) >> /var/log/cron.log 2>&1
*/1 * * * * root echo “1111″ >> /var/log/cron.log 2>&1
*/1 * * * * root echo $(date +\%T) >> /var/log/cron.log 2>&1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#xiaorui.cc
FROM
ubuntu
:
latest
MAINTAINER
rfyiamcool
@
163.com
ADD
crontab
/
etc
/
cron
.
d
/
hello
-
cron
RUN
echo
xiaorui
.
cc
RUN
chmod
0644
/
etc
/
cron
.
d
/
hello
-
cron
RUN
touch
/
var
/
log
/
cron
.
log
CMD
cron
&&
tail
-
f
/
var
/
log
/
cron
.
log
|
构建含有crontab的docker image镜像。
sudo docker build –rm -t xiaorui.cc/docker-crontab .
启动这个容器。
sudo docker run -t -i xiaorui.cc/docker-crontab
过两分钟我们会看到,容器输出的日志.
Hello world
Hello world