跳转至

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

验证

容器内的进程,注意 pid1 的是 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

参考

docker 使用 supervisor 管理多进程

回到页面顶部