使用 supervisor 支持容器crontab任务计划
2017-06-27 by dongnan
目标
Docker 创建的 python
容器,支持 crontab
任务计划。
环境
创建的 docker
容器只支持单个进程,如果需要运行多个进程,例如任务计划 cron
进程,可以使用 supervisor
进程管理器,管理多个进程。
示例中,使用 supervisor
管理 cron
进程 与 python
程序 demo.py
,而 docker
容器启动 supervisord
进程。
虽然使用容器运行多进程不是 docker
所倡导的理念,但是对于业务环境而言,crontab
任务计划在某些场景下是不可缺少的。
Docker镜像
官方 python:2.7
容器系统版本
head -n1 /etc/issue
Debian GNU/Linux 8 \n \l
步骤
配置文件
目录结构
tree .
.
├── conf
│ ├── crontab
│ ├── sources.list
│ └── supervisord.conf
├── Dockerfile
├── src
│ └── irm-py
│ ├── demo.py
└── war2image.sh
Dockerfile 文件
cat Dockerfile
# python:2.7-zzx
#
# VERSION 0.1
FROM hub.zongming.net/library/python:2.7
MAINTAINER dongnan
# make sure the package repository is up to date
# apt
ADD conf/sources.list /etc/apt/sources.list
RUN apt-get update && apt-get install -y cron supervisor && rm -r /var/lib/apt/lists/*
# env
ENV TZ=Asia/Shanghai LANG=en_US.UTF-8
# crontab
COPY conf/crontab /var/spool/cron/crontabs/root
RUN chmod 600 /var/spool/cron/crontabs/root
# supervisor
RUN mkdir -p /var/log/supervisor
ADD conf/supervisord.conf /etc/supervisor/supervisord.conf
# python
COPY src/irm-py /root/irm-py
RUN pip install pymysql
# workdir
WORKDIR /root/irm-py
# cmd
CMD ["/usr/bin/supervisord","-c","/etc/supervisor/supervisord.conf"]
crontab 文件
cat conf/crontab
0 0 * * * /bin/cat /dev/null > /root/irm-py/demo.log
superviosr 文件
cat conf/supervisord.conf
[supervisord]
nodaemon=true
pidfile=/var/run/supervisord.pid
logfile=/var/log/supervisor/supervisord.log
[program:crond]
command=/usr/sbin/cron -f
[program:python]
command=python /root/irm-py/background.py
#stdout_logfile=/root/irm-py/access.log
stderr_logfile=/root/irm-py/irm-py.log
Demo 程序这里更换成你的 python
程序目录即可。
创建镜像
按照 Dockerfile
定义的规则,创建 docker
镜像。
docker build -t zongming.net/irms/python-ci:0.0.1 .
创建容器
docker run --name test -tid zongming.net/irms/python-ci:0.0.1
验证
容器内的进程,注意 pid
为1 的是 supervisord
。
docker exec -ti test2 ps -auxww
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 4216 348 ? Ss 17:35 0:00 /usr/bin/tini -- /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
root 6 0.0 0.2 47080 12264 ? S+ 17:35 0:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
root 9 0.1 1.2 454448 71528 ? Sl 17:35 0:01 python /root/irm-py/demo.py
root 10 0.0 0.0 27584 1276 ? S 17:35 0:00 /usr/sbin/cron -f