Deployment 如何:弹性豆茎&x2B;部署docker+;优雅关机
嗨,这里的伟大人民 我们在EB上托管了一个docker容器,其中运行了基于nodejs的代码。 在重新部署docker容器时,我们希望旧容器能够正常关闭 我找到了一些帮助和指南,帮助我们的代码如何接收由“docker stop”命令生成的sigterm信号 但是,对运行docker的EB机器的进一步调查如下:Deployment 如何:弹性豆茎&x2B;部署docker+;优雅关机,deployment,docker,amazon-elastic-beanstalk,redeploy,Deployment,Docker,Amazon Elastic Beanstalk,Redeploy,嗨,这里的伟大人民 我们在EB上托管了一个docker容器,其中运行了基于nodejs的代码。 在重新部署docker容器时,我们希望旧容器能够正常关闭 我找到了一些帮助和指南,帮助我们的代码如何接收由“docker stop”命令生成的sigterm信号 但是,对运行docker的EB机器的进一步调查如下: /opt/elasticbeanstalk/hooks/appdeploy/incode/01flip.sh 显示当从当前容器“翻转”到新暂存容器时,旧容器将被“docker kill”杀
/opt/elasticbeanstalk/hooks/appdeploy/incode/01flip.sh
显示当从当前容器“翻转”到新暂存容器时,旧容器将被“docker kill”杀死
有没有办法将此行为更改为docker stop?还是通常推荐的处理旧容器正常关闭的方法
谢谢 自我回答,因为我找到了一个适合我们的解决方案: tl;dr:使用.ebextensions脚本在01flip之前运行脚本,您的脚本将确保docker中的任何内容都能正常关闭 首先, 您的应用程序(或docker中运行的任何应用程序)必须能够捕获信号,例如SIGINT,并在信号发出后优雅地关闭。
这与Docker完全无关,您可以在任何地方(例如本地)测试它的运行 关于在网络上为不同类型的应用程序实现这种行为,有很多信息(比如ruby、node.js等等) 秒, 基于EB/Docker的项目可以有一个.ebextensions文件夹,其中包含部署时要执行的所有脚本。 我们将两个自定义脚本放入其中,分别是gracefulshutdown_01.config和gracefulshutdown_02.config文件,如下所示:
# gracefulshutdown_01.config
commands:
backup-original-flip-hook:
command: cp -f /opt/elasticbeanstalk/hooks/appdeploy/enact/01flip.sh /opt/elasticbeanstalk/hooks/appdeploy/01flip.sh.bak
test: '[ ! -f /opt/elasticbeanstalk/hooks/appdeploy/01flip.sh.bak ]'
cleanup-custom-hooks:
command: rm -f 05gracefulshutdown.sh
cwd: /opt/elasticbeanstalk/hooks/appdeploy/enact
ignoreErrors: true
以及:
gracefulshutdown_01.config是一个小的util,用于备份原始flip01并删除(如果存在)自定义脚本
gracefulshutdown_02.config是神奇的地方。
它创建了一个05gracefulshutdown脚本,并通过将其重命名为10flip来确保flip随后会发生
自定义脚本05gracefulshutdown基本上执行以下操作:
- 查找当前正在运行的docker
- 查找所有需要发送SIGINT的进程(对于我们来说,它的进程名称中包含“workers”)
- 向上述进程发送sigint
- 循环:
- 检查以前的进程是否已终止
- 继续循环多次尝试
- 如果尝试结束,以状态“1”退出,不要继续10翻转,需要手动干预
我想它也可以在很多方面得到改进,所以玩得开心。我认为连接排水并不能满足您的需要?我正在努力实现这个功能,即使运行了这个功能,流程中似乎也会自动恢复。您体验过吗?
# gracefulshutdown_02.config
commands:
reorder-original-flip-hook:
command: mv /opt/elasticbeanstalk/hooks/appdeploy/enact/01flip.sh /opt/elasticbeanstalk/hooks/appdeploy/enact/10flip.sh
test: '[ -f /opt/elasticbeanstalk/hooks/appdeploy/enact/01flip.sh ]'
files:
"/opt/elasticbeanstalk/hooks/appdeploy/enact/05gracefulshutdown.sh":
mode: "000755"
owner: root
group: root
content: |
#!/bin/sh
# find currently running docker
EB_CONFIG_DOCKER_CURRENT_APP_FILE=$(/opt/elasticbeanstalk/bin/get-config container -k app_deploy_file)
EB_CONFIG_DOCKER_CURRENT_APP=""
if [ -f $EB_CONFIG_DOCKER_CURRENT_APP_FILE ]; then
EB_CONFIG_DOCKER_CURRENT_APP=`cat $EB_CONFIG_DOCKER_CURRENT_APP_FILE | cut -c 1-12`
echo "Graceful shutdown on app container: $EB_CONFIG_DOCKER_CURRENT_APP"
else
echo "NO CURRENT APP TO GRACEFUL SHUTDOWN FOUND"
exit 0
fi
# give graceful kill command to all running .js files (not stats!!)
docker exec $EB_CONFIG_DOCKER_CURRENT_APP sh -c "ps x -o pid,command | grep -E 'workers' | grep -v -E 'forever|grep' " | awk '{print $1}' | xargs docker exec $EB_CONFIG_DOCKER_CURRENT_APP kill -s SIGINT
echo "sent kill signals"
# wait (max 5 mins) until processes are done and terminate themselves
TRIES=100
until [ $TRIES -eq 0 ]; do
PIDS=`docker exec $EB_CONFIG_DOCKER_CURRENT_APP sh -c "ps x -o pid,command | grep -E 'workers' | grep -v -E 'forever|grep' " | awk '{print $1}' | cat`
echo TRIES $TRIES PIDS $PIDS
if [ -z "$PIDS" ]; then
echo "finished graceful shutdown of docker $EB_CONFIG_DOCKER_CURRENT_APP"
exit 0
else
let TRIES-=1
sleep 3
fi
done
echo "failed to graceful shutdown, please investigate manually"
exit 1