小编典典

使用主管管理Docker容器的最佳方法

jenkins

我必须在 同一台 服务器上(客户端要求)设置“ dockerized”环境(集成,质量保证和生产)。每种环境的组成如下:

  • Rabbitmq
  • 芹菜
  • 基于python 3的应用程序,称为“ A”(每个环境的特定分支)

在它们之上,jenkins将处理基于CI的部署。

在每个环境中使用一组容器听起来是最好的方法。

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

  • 3个兔子容器,
  • 3个芹菜/花卉容器,
  • 3个“ A”容器,
  • 1个詹金斯容器。

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

因此,我想知道分离每个环境并能够管理和监督每个服务(容器)的最佳方法是什么。

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

每个容器都由一个看起来像

兔子整合

#!/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
}

阅读 291

收藏
2020-07-25

共1个答案

小编典典

根据其文档,Supervisor要求其管理的进程不得守护进程:

打算在主管下运行的程序不应守护自己。相反,它们应该在前台运行。它们不应与启动它们的终端分离。

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

为了能够将Docker与Supervisor一起使用,您可以编写与Docker一起使用的pidproxy程序的等效项。


但是实际上,这两个工具并不是真正设计为可以协同工作,因此您应该考虑更改其中一个:

  • 考虑使用Docker Compose(旨在与Docker配合使用)替换Supervisor
  • 考虑用Rocket替换Docker (它没有“主”进程)
2020-07-25