Docker 컨테이너를 정상적으로 종료하는 방법

Docker 컨테이너를 정상적으로 종료하는 방법

CentOS 7을 실행하는 도커 컨테이너가 있습니다.

PID 1로 스크립트를 실행 중입니다 wrapper_script.sh. 또한 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 stopDocker는 먼저 프로세스를 중지하도록 요청하고 기본 10초 내에 이를 따르지 않으면 강제로 종료됩니다. docker stop반환하는 데 10초 이상 걸리는 경우 이는 컨테이너가 이 시간 내에 응답하지 않았음을 의미합니다.

docker stop명령은 먼저 컨테이너의 루트 프로세스(PID 1)에 SIGTERM 신호를 보내 실행 중인 컨테이너를 중지하려고 시도합니다. 이 시간 초과 내에 프로세스가 종료되지 않으면 SIGKILL 신호가 전송됩니다.

프로세스가 SIGTERM 신호를 무시하도록 선택할 수 있지만 SIGKILL은 무시할 수 없습니다. SIGKILL이 실행된 후에는 프로세스에서 신호를 볼 수 없으므로 정리 작업을 수행할 수 없습니다.

SIGKILL을 보내기 전에 Docker 데몬이 대기하는 시간(초)을 제어할 수 있습니다. 프로세스를 완료하는 데 시간이 더 필요한 경우 다음과 같은 명령을 사용할 수 있습니다.

docker stop --time=30 mycontainer

프로세스가 중단된 경우 이 정리 작업을 수행하려면 프로세스를 완전히 종료해야 하는 경우 그 이유를 찾아야 합니다.

관련 정보