我必须在 同一台 服务器上(客户端要求)设置“ 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
程序的等效项。
但是实际上,这两个工具并不是真正设计为可以协同工作,因此您应该考虑更改其中一个:
问题内容: 我已经和Docker玩了一段时间,在处理持久性数据时继续寻找相同的问题。 我创建我的文件并公开一个卷,或使用它[在容器中安装主机文件夹]。 我应该对主机上的共享卷应用什么权限? 我可以想到两种选择: 到目前为止,我已经授予所有人读取/写入访问权限,因此我可以从Docker容器写入该文件夹。 将用户从主机映射到容器,以便我可以分配更多的细化权限。不确定这是否可能,但尚未找到很多相关信息。
我使用Docker已经有一段时间了,并且在处理持久数据时不断发现相同的问题。 我创建并公开卷,或者使用在容器中装入主机文件夹。 我应该对主机上的共享卷应用什么权限? 我能想到两个选择: > 到目前为止,我已经为每个人提供了读/写访问权限,因此我可以从Docker容器写入文件夹。 将用户从主机映射到容器中,这样我就可以分配更多的粒度权限。不确定这是可能的,但还没有找到很多关于它。到目前为止,我所能做
创建容器docker run 创建容器 # docker run --name rhel7.4 registry.access.redhat.com/rhel7-atomic:7.4-119docker run 创建容器并进入命令行 # docker run --name rhel7.4 -it registry.access.redhat.com/rhel7-atomic:7.4-119 /b
问题内容: 管理数据库更改的最佳方法是什么?无论数据库客户端的语言如何,我都需要一个解决方案。我还希望能够在那些更改中使用特定的数据库功能,例如存储过程,触发器等。 问题答案: 首先,请确保您已编写了完整的数据库构建脚本,以便可以根据需要重建数据库。 然后,应将每个更改写为更新脚本。这样,您可以针对数据库分别运行每个更改。 将更改提交到代码库后,将更改脚本与构建过程合并,使其自动发生…然后将更改脚
我有什么可用的选择来使用GWT来实现这一点?
在本地主机的LXC容器中是否有用于管理节点的傀儡模块?例如:我有一个带有50个LXC容器的主机,我想直接从主机管理所有这些容器,而不是从另一个带有的LXC容器。