我必须在同一台服务器上设置“dockerized”环境(集成,qa和生产)(客户端的要求).每个环境将按如下方式组成:
> rabbitmq
>芹菜
>花
>基于python 3的应用程序称为“A”(特定分支)
环境)
在他们之上,jenkins将基于CI处理部署.
每个环境使用一组容器听起来像是最好的方法.
但现在我需要,流程经理来运行和监督所有这些:
> 3个兔子容器,
> 3个芹菜/花卉容器,
> 3“A”容器,
> 1个jenkins容器.
Supervisord似乎是最好的选择,但在我的测试中,我无法“正确”重启容器.这是supervisord.conf的片段
@H_301_24@[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
@H_301_24@#!/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看起来像:
@H_301_24@# 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看起来像:
@H_301_24@#!/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看起来像:
@H_301_24@[program:rabbit-integration]
command=/path/sh_s/rabbit-integration.sh
startsecs=20
priority=90
autorestart=unexpected
exitcodes=0,1
stopsignal=TERM
在我想要使用相同容器的情况下,启动功能看起来像:
@H_301_24@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
}
哪里
@H_301_24@function _run_my_container (){
/usr/bin/docker run -p{} -v{} --name "$NAME" myimage &
PID=$!
wait $PID
}
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(没有“主”进程)