2015-09-09 11 views
7

こんにちは偉大な人々、HOWTO:Elastic Beanstalkで+ stackoverflowののドッキングウィンドウ+正常なシャットダウンを展開

はそれを実行しているnodejs基づいてコードをEBにドッカコンテナをホスティングしました。 ドッカーコンテナを再デプロイするとき、古いものを元に戻すことができます。

&私たちのコードが 'docker stop'コマンドによって生成されたsigtermシグナルを受け取る方法に関するヘルプが見つかりました。でドッキングウィンドウを実行しているEBマシンに

しかし、さらなる調査: /opt/elasticbeanstalk/hooks/appdeploy/enact/01flip.sh は新しい段階的なコンテナに現在から「反転」、古いものは「ドッカキル」で殺されたとき

は、どのような方法があることを示していますこの動作をドッキング停止に変更するには?
一般的に、古いコンテナの正常なシャットダウンを処理するための推奨される方法はありますか?

ありがとうございます!私は私たちのために機能するソリューションを見つけたよう

答えて

3

自己応答:

TL; DRは:使用.ebextensionsスクリプトが01flip前にスクリプトを実行するために、あなたのスクリプトは必ずwhateversの正常なシャットダウンの内側を行いますドッキングウィンドウは、優雅にそれに

最初、 あなたのアプリ(またはyour'eがドッキングウィンドウで実行されているものは何でも)信号、例えばSIGINTをキャッチすることができなければならない、とシャットダウンに行われます。
これはDockerとはまったく関係がありません。どこでも実行できます(たとえばローカル) ネット上のさまざまな種類のアプリケーションに対してこのような動作をさせるための情報がたくさんあります(ルビー、node.jsなど...)

第二、 あなたのEB /ドッカーベースのプロジェクトは、すべてのちょっとデプロイするときに実行するスクリプトの保持.ebextensionsフォルダを持つことができます。 我々は、それには、このようになりますgracefulshutdown_01.configとgracefulshutdown_02.configファイル2つのカスタムスクリプトを置く:gracefulshutdown_01.configは、そのバックアップutilの小さい

# 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 

# 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 

とを元のflip01を削除し、カスタムスクリプトを削除します(存在する場合)。

gracefulshutdown_02.configは、魔法の発生場所です。 05gracefulshutdownエナクトスクリプトを作成し、それを10flipに名前を変更して後で起こることを確認します。

05gracefulshutdown、カスタムスクリプトは、この基本的に行います。

  • その名
  • に「労働者と私たちのために(そのプロセスがSIGINTを送信する必要のあるすべてのプロセスを見つけ、現在実行中のドッキングウィンドウに
  • を見つけます
  • は、上記のプロセスにSIGINTを送る
  • ループ:前からのプロセスが終了した場合は
  • チェック
  • 試行回数分のループを続ける試行が終了し、ステータスが「1」で終了しても10flipにならない場合は手動による干渉が必要です。

これは、あなただけのマシン上で実行されている1つのドッキングウィンドウを持っている、とあなたが手動の場合には、それは(私たちはまだ起こったことがないために)失敗したいただきました!間違ってチェックすることでホップすることができることを前提としています。
私はそれも多くの点で改善できると思うので、楽しんでください。

関連する問題