Deployment 如何:弹性豆茎&x2B;部署docker+;优雅关机

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”杀

嗨,这里的伟大人民

我们在EB上托管了一个docker容器,其中运行了基于nodejs的代码。 在重新部署docker容器时,我们希望旧容器能够正常关闭

我找到了一些帮助和指南,帮助我们的代码如何接收由“docker stop”命令生成的sigterm信号

但是,对运行docker的EB机器的进一步调查如下:
/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翻转,需要手动干预
这假设您只有一个docker在机器上运行,并且您能够手动跳上机器,在机器出现故障的情况下检查出了什么问题(对于我们来说,这种情况从未发生过)。

我想它也可以在很多方面得到改进,所以玩得开心。

我认为连接排水并不能满足您的需要?我正在努力实现这个功能,即使运行了这个功能,流程中似乎也会自动恢复。您体验过吗?
# 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