Ali*_*MAR 8 python continuous-integration jenkins docker
我必须在同一台服务器上设置"dockerized"环境(集成,qa和生产)(客户端的要求).每个环境将按如下方式组成:
在他们之上,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
Run Code Online (Sandbox Code Playgroud)
所以我想知道什么是分离每个环境的最佳方式,并能够管理和监督每个服务(一个容器).
[编辑我的解决方案受托马斯回应的启发]
每个容器都由一个看起来像的.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
Run Code Online (Sandbox Code Playgroud)
$ 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
Run Code Online (Sandbox Code Playgroud)
$ 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
}
Run Code Online (Sandbox Code Playgroud)
至少myconfig.intergration.conf看起来像:
[program:rabbit-integration]
command=/path/sh_s/rabbit-integration.sh
startsecs=20
priority=90
autorestart=unexpected
exitcodes=0,1
stopsignal=TERM
Run Code Online (Sandbox Code Playgroud)
在我想要使用相同容器的情况下,启动功能看起来像:
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
}
Run Code Online (Sandbox Code Playgroud)
哪里
function _run_my_container (){
/usr/bin/docker run -p{} -v{} --name "$NAME" myimage &
PID=$!
wait $PID
}
Run Code Online (Sandbox Code Playgroud)
Tho*_*zco 12
根据其文档,Supervisor要求它管理的进程不会守护进程:
意味着在主管下运行的程序不应该自己守护.相反,它们应该在前台运行.他们不应该从他们开始的终端分离.
这在很大程度上与Docker不兼容,其中容器是Docker进程本身的子进程(即因此不是Supervisor的子进程).
为了能够将Docker与Supervisor一起使用,您可以编写与Docker一起使用的等效pidproxy程序.
但实际上,这两个工具并没有真正构建为一起工作,所以你应该考虑改变其中一个:
小智 9
您需要确保在supervisor配置中使用stopsignal = INT,然后docker run正常执行.
[program:foo]
stopsignal=INT
command=docker -rm run whatever
Run Code Online (Sandbox Code Playgroud)
至少这似乎适用于Docker版本1.9.1.
如果在shell脚本中运行docker form,那么exec在docker run命令前面进行操作非常重要,这样就可以docker run替换shell进程,从而直接从supervisord接收SIGINT.
| 归档时间: |
|
| 查看次数: |
7150 次 |
| 最近记录: |