加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 03:34:19 所属栏目:安全 来源:网络整理
导读:我必须在同一台服务器上设置“dockerized”环境(集成,qa和生产)(客户端的要求).每个环境将按如下方式组成: rabbitmq 芹菜 花 基于python 3的应用程序称为“A”(特定分支) 环境) 在他们之上,jenkins将基于CI处理部署. 每个环境使用一组容器听起来像是最好的

我必须在同一台服务器上设置“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(没有“主”进程)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读