我必须在 同一台 服务器上(客户端要求)设置“ dockerized”环境(集成,质量保证和生产)。每种环境的组成如下:
在它们之上,jenkins将处理基于CI的部署。
在每个环境中使用一组容器听起来是最好的方法。
但是现在我需要流程经理来运行和监督所有这些:
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 }
根据其文档,Supervisor要求其管理的进程不得守护进程:
打算在主管下运行的程序不应守护自己。相反,它们应该在前台运行。它们不应与启动它们的终端分离。
这在很大程度上与Docker不兼容,后者的容器是 Docker进程 本身的子 进程 (即,因此不是Supervisor的子 进程 )。
为了能够将Docker与Supervisor一起使用,您可以编写与Docker一起使用的pidproxy程序的等效项。
pidproxy
但是实际上,这两个工具并不是真正设计为可以协同工作,因此您应该考虑更改其中一个: