使用 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