我必须在相同的服务器(客户端的需求)上设置"dockerized“环境(集成、qa和产品)。每个环境将组成如下:
在它们之上,jenkins将处理基于CI的部署。
每个环境使用一组容器听起来是最好的方法。
但是现在我需要过程经理来运行和监督所有这些:
监督似乎是最好的选择,但在我的测试中,我无法“正确”重新启动一个容器。这里是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因此,我想知道分离每个环境并能够管理和监督每个服务(一个容器)的最佳方法是什么。
编辑我的解决方案受Thomas 启发
每个容器都由一个.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
}发布于 2015-05-04 16:47:29
发布于 2016-02-01 16:43:37
您需要确保在主管配置中使用stopsignal=INT,然后才能正常执行docker run。
[program:foo]
stopsignal=INT
command=docker -rm run whatever至少这似乎适用于我的码头版本1.9.1。
如果您在shell脚本中运行docker,那么在docker命令前面有exec是非常重要的,这样docker run就可以替换shell进程,从而直接从supervisord接收SIGINT。
发布于 2016-03-23 18:33:00
你可以让Docker不分离,然后一切都很好。我们通过主管来管理我们的码头集装箱。码头组成是伟大的,但如果你已经使用主管管理非码头的事情以及,这是很好的继续使用它,让您的所有管理在一个地方。我们将在bash脚本中运行我们的对接者,如下所示,并让主管跟踪它,一切都很好:
#!/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_TAGhttps://stackoverflow.com/questions/30034813
复制相似问题