Как корректно завершить работу Docker-контейнера

Как корректно завершить работу Docker-контейнера

У меня есть Docker-контейнер под управлением CentOS 7.

Он запускает скрипт wrapper_script.shкак PID 1. Он также имеет нижеследующее в docker compose.

CMD ["/wrapper_script.sh"]

Я попробовал docker stopна контейнере. Он не выполняет функцию очистки. Он напрямую останавливает контейнер.

Пробовал docker kill --signal="SIGTERM" <containername>. Он также не выполняет функцию очистки. Также обратите внимание, что это не убивает/не останавливает сам контейнер.

Пожалуйста, помогите исправить это. Любые предложения приветствуются.

wrapper_script.shвыглядит следующим образом:

#!/usr/bin/env bash
cleanup() {
    echo "Cleaning up..."
    /wrapper-script-stop.sh
}
trap 'cleanup' SIGTERM EXIT
/run-something.sh
while sleep 60; do
  ps aux |grep run-something.sh |grep -q -v grep
  PROCESS_1_STATUS=$?
  if [ $PROCESS_1_STATUS -ne 0 ]; then
    echo "One of the processes has already exited."
    exit 1
  fi
done

решение1

Я не понимаю связи между bash-скриптом и вопросом, но вот некоторая информация об остановке контейнера.

Когда вы даете docker stopкоманду, Docker сначала вежливо попросит остановить процесс, и если он не выполнит команду в течение 10 секунд по умолчанию, он будет принудительно завершен. Если docker stopдля возврата требуется более 10 секунд, это означает, что ваш контейнер не ответил в течение этого времени.

Команда docker stopпытается сначала остановить работающий контейнер, отправляя сигнал SIGTERM корневому процессу (PID 1) в контейнере. Если процесс не завершается в течение этого времени ожидания, будет отправлен сигнал SIGKILL.

Возможно, ваш процесс выбирает игнорирование сигнала SIGTERM, но он не может игнорировать SIGKILL. После выдачи SIGKILL процесс даже не увидит сигнал, поэтому не сможет выполнить никаких действий по очистке.

Вы можете контролировать количество секунд, которые демон Docker будет ждать перед отправкой SIGKILL. Если вашему процессу требуется больше времени для завершения, вы можете использовать команду, например:

docker stop --time=30 mycontainer

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

Связанный контент