python – 使用supervisord管理docker容器的最佳方法

前端之家收集整理的这篇文章主要介绍了python – 使用supervisord管理docker容器的最佳方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我必须在同一台服务器上设置“dockerized”环境(集成,qa和生产)(客户端的要求).每个环境将按如下方式组成:

> rabbitmq
>芹菜
>花
>基于python 3的应用程序称为“A”(特定分支)
环境)

在他们之上,jenkins将基于CI处理部署.

每个环境使用一组容器听起来像是最好的方法.

但现在我需要,流程经理来运行和监督所有这些:

> 3个兔子容器,
> 3个芹菜/花卉容器,
> 3“A”容器,
> 1个jenkins容器.

Supervisord似乎是最好的选择,但在我的测试中,我无法“正确”重启容器.这是supervisord.conf的片段

[program:docker-rabbit]
command=/usr/bin/docker run -p 5672:5672 -p 15672:15672 tutum/rabbitmq
startsecs=20
autorestart=unexpected
exitcodes=0,1
stopsignal=KILL

所以我想知道什么是分离每个环境的最佳方式,并能够管理和监督每个服务(一个容器).

[编辑我的解决方案受托马斯回应的启发]

每个容器都由一个看起来像的.sh脚本运行

rabbit-integration.py

#!/bin/bash

#set -x
SERVICE="rabbitmq"
SH_S = "/path/to_shs"
export MY_ENV="integration"
. $SH_S/env_.sh
. $SH_S/utils.sh

SERVICE_ENV=$SERVICE-$MY_ENV
ID_FILE=/tmp/$SERVICE_ENV.name # pid file 

trap stop SIGHUP SIGINT SIGTERM  # trap signal for calling the stop function
run_rabbitmq   

$SH_S / env_.sh看起来像:

# set env variable 
...
case $MONARCH_ENV in
    $INTEGRATION)
       AMQP_PORT="5672"
       AMQP_IP="172.17.42.1"
     ...
    ;;
    $PREPRODUCTION)
       AMQP_PORT="5673"
       AMQP_IP="172.17.42.1"
       ...
        ;;
    $PRODUCTION)
        AMQP_PORT="5674"
        REDIS_IP="172.17.42.1"
        ...
esac

$SH_S / utils.sh看起来像:

#!/bin/bash

function random_name(){
        echo "$SERVICE_ENV-$(cat /proc/sys/kernel/random/uuid)"
}
function stop (){
        echo "stopping docker container..."
        /usr/bin/docker stop `cat $ID_FILE`
}
function run_rabbitmq (){
        # do no daemonize and use stdout
        NAME="$(random_name)"
        echo $NAME > $ID_FILE
        /usr/bin/docker run -i --name "$NAME" -p $AMQP_IP:$AMQP_PORT:5672 -p $AMQP_ADMIN_PORT:15672 -e RABBITMQ_PASS="$AMQP_PASSWORD" myimage-rabbitmq &
        PID=$!
        wait $PID
}

至少myconfig.intergration.conf看起来像:

[program:rabbit-integration]
command=/path/sh_s/rabbit-integration.sh
startsecs=20
priority=90
autorestart=unexpected
exitcodes=0,1
stopsignal=TERM

在我想要使用相同容器的情况下,启动功能看起来像:

function _run_my_container () {
    NAME="my_container"
    /usr/bin/docker start -i $NAME &
    PID=$!
    wait $PID
    rc=$?
    if [[ $rc != 0 ]]; then
       _run_my_container 
    fi
}

哪里

function _run_my_container (){
    /usr/bin/docker run -p{} -v{} --name "$NAME" myimage &
    PID=$!
    wait $PID
}
最佳答案
主管要求它管理的进程不会守护,根据其documentation

Programs meant to be run under supervisor should not daemonize
themselves. Instead,they should run in the foreground. They should
not detach from the terminal from which they are started.

这在很大程度上与Docker不兼容,其中容器是Docker进程本身的子进程(即因此不是Supervisor的子进程).

为了能够将Docker与Supervisor一起使用,您可以编写与Docker一起使用的等效的pidproxy program.

但实际上,这两个工具并没有真正构建为一起工作,所以你应该考虑改变其中一个:

>考虑用Docker Compose替换Supervisor(设计用于Docker)
>考虑用Rocket替换Docker(没有“主”进程)

原文链接:https://www.f2er.com/docker/436526.html

猜你在找的Docker相关文章