首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用监督管理码头集装箱的最佳方法

用监督管理码头集装箱的最佳方法
EN

Stack Overflow用户
提问于 2015-05-04 16:15:16
回答 4查看 11.4K关注 0票数 11

我必须在相同的服务器(客户端的需求)上设置"dockerized“环境(集成、qa和产品)。每个环境将组成如下:

  • 狂犬病
  • 芹菜
  • 基于python 3的名为"A“的应用程序(每个环境的特定分支)

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

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

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

  • 三个兔子容器,
  • 3个芹菜/花盆,
  • 3个"A“容器,
  • 1个jenkins集装箱。

监督似乎是最好的选择,但在我的测试中,我无法“正确”重新启动一个容器。这里是supervisord.conf的一个片段

代码语言:javascript
复制
[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

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

编辑我的解决方案受Thomas 启发

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

rabbit-integration.py

代码语言:javascript
复制
#!/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如下所示:

代码语言:javascript
复制
# 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如下所示:

代码语言:javascript
复制
#!/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看起来是这样的:

代码语言:javascript
复制
[program:rabbit-integration]
command=/path/sh_s/rabbit-integration.sh
startsecs=20
priority=90
autorestart=unexpected
exitcodes=0,1
stopsignal=TERM

在这种情况下,我希望使用与启动函数类似的容器:

代码语言:javascript
复制
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
}

哪里

代码语言:javascript
复制
function _run_my_container (){
    /usr/bin/docker run -p{} -v{} --name "$NAME" myimage &
    PID=$!
    wait $PID
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-05-04 16:47:29

监督器要求它管理的进程不像它的文档那样去守护。

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

这在很大程度上与Docker不兼容,其中容器是Docker流程本身的子流程(也就是说,因此不是主管的子流程)。

为了能够与主管一起使用Docker,您可以编写与Docker一起工作的等效程序

但实际上,这两种工具的架构并不是真正的协同工作,所以您应该考虑更改其中的一种:

  • 考虑用码头组成代替主管(这是设计用于与Docker一起工作的)
  • 考虑用火箭替换Docker (它没有“主”进程)
票数 14
EN

Stack Overflow用户

发布于 2016-02-01 16:43:37

您需要确保在主管配置中使用stopsignal=INT,然后才能正常执行docker run

代码语言:javascript
复制
[program:foo]
stopsignal=INT
command=docker -rm run whatever

至少这似乎适用于我的码头版本1.9.1。

如果您在shell脚本中运行docker,那么在docker命令前面有exec是非常重要的,这样docker run就可以替换shell进程,从而直接从supervisord接收SIGINT。

票数 10
EN

Stack Overflow用户

发布于 2016-03-23 18:33:00

你可以让Docker不分离,然后一切都很好。我们通过主管来管理我们的码头集装箱。码头组成是伟大的,但如果你已经使用主管管理非码头的事情以及,这是很好的继续使用它,让您的所有管理在一个地方。我们将在bash脚本中运行我们的对接者,如下所示,并让主管跟踪它,一切都很好:

代码语言:javascript
复制
#!/bin/bash¬
TO_STOP=docker ps | grep $SERVICE_NAME | awk '{ print $1 }'¬
if [$TO_STOP != '']; then¬
    docker stop $SERVICE_NAME¬
fi¬
TO_REMOVE=docker ps -a | grep $SERVICE_NAME | awk '{ print $1 }'¬
if [$TO_REMOVE != '']; then¬
    docker rm $SERVICE_NAME¬
fi¬
¬
docker run -a stdout -a stderr --name="$SERVICE_NAME" \
 --rm $DOCKER_IMAGE:$DOCKER_TAG
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30034813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档