Howto: упругий beanstalk + развертывание докера + грациозное закрытие

Привет, великие люди stackoverflow,

Были размещены контейнеры докеров на ** с запущенным на нем кодом nodejs. При перераспределении нашего контейнера докеров мы хотим, чтобы старый выполнял грациозное завершение.

Я нашел помощь и рекомендации о том, как наш код может получить сигнал сигммера, созданный командой "docker stop".

Однако дальнейшее исследование машины **, работающей с докером, осуществляется по адресу: /opt/elasticbeanstalk/hooks/appdeploy/enact/01flip.sh показывает, что при "переворачивании" с текущего на новый поэтапный контейнер старый убит с помощью "docker kill"

Есть ли способ изменить это поведение на остановке докеров? Или, как правило, рекомендуемый подход к обработке грациозного отключения старого контейнера?

Спасибо!

1 ответ

Автоответчик, поскольку я нашел решение, которое работает для нас:

tl; dr: используйте сценарии .************, чтобы запустить ваш script до 01flip, ваш script будет следить за грациозным отключением whartervers внутри докера.

первый, ваше приложение (или что бы вы ни делали в докере) должно было уловить сигнал, например, SIGINT и изящно закрыть его. это полностью не связано с Docker, вы можете проверить его работу везде (локально, например) Существует много информации о том, как добиться такого поведения для разных приложений в сети (будь то ruby, node.js и т.д.)

Второй, ваш проект на основе **/Docker может иметь папку .************, в которой все сценарии выполняются во время развертывания. мы помещаем в него 2 пользовательских скрипта, 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_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
 **_CONFIG_DOCKER_CURRENT_APP_FILE=$(/opt/elasticbeanstalk/bin/get-config container -k app_deploy_file)
 **_CONFIG_DOCKER_CURRENT_APP=""
 if [ -f $**_CONFIG_DOCKER_CURRENT_APP_FILE ]; then
 **_CONFIG_DOCKER_CURRENT_APP=`cat $**_CONFIG_DOCKER_CURRENT_APP_FILE | cut -c 1-12`
 echo "Graceful shutdown on app container: $**_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 $**_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 $**_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 $**_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 $**_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 - небольшая утилита, которая создает резервные копии исходного flip01 и удаляет (если существует) наш пользовательский script.

gracefulshutdown_02.config, где происходит волшебство. он создает команду 05gracefulshutdown enact script и гарантирует, что флип произойдет после этого, переименовав его в 10flip.

05gracefulshutdown, пользовательский script, делает это в основном:

  • найти текущую рабочую док-станцию ​​
  • найти все процессы, которые нужно отправить SIGINT (для нас его процессы с "рабочими" в его имени
  • отправить сиг- нат в указанные выше процессы.
  • цикл:
  • проверить, были ли убиты предыдущие процессы.
  • продолжить цикл для количества попыток
  • Если попытки завершены, выйдите со статусом "1" и не продолжайте 10flip, необходимы ручные вмешательства.

это предполагает, что на машине работает только 1 докер, и вы можете вручную перескакивать, чтобы проверить, что случилось, в случае его неудачи (для нас еще не произошло). Я думаю, что это также можно улучшить во многих отношениях, так что получайте удовольствие.

licensed under cc by-sa 3.0 with attribution.