카테고리 없음

Docker 컨테이너 종료 시그널

Mussyan 2021. 1. 4. 21:08

- 이슈 : 도커 컨테이너내 어플리케이션이 도커가 종료시 종료 시그널을 받지 못함.

- 영향 : 유레카 클라이언트가 돌고 있는 어플리케이션이라 서비스 종료시 유레카 클라이언트 Unregister를 못함.

- 원인 : 도커의 Entrypoint 실행을 shell script로 감싸서 실행하여 종료 시그널을 shell script가 받고 어플리케이션까지 전달 못함.

- 해결 : shell script를 제거하고 entrypoint에서 서비스를 직접 실행

- 기타 : shell script를 사용하면서 서비스까지 종료 시그널을 전달하는 방법

  • trap 을 이용하여 script 에서 어플리케이션으로 sigterm 전달
  • what is trap - https://mug896.github.io/bash-shell/trap.html
  • #!/bin/sh
    
    set -x
    pid=0
    
    # SIGTERM-handler
    term_handler() {
      if [ $pid -ne 0 ]; then
        kill -SIGTERM "$pid"
        wait "$pid"
      fi
      exit 143; # 128 + 15 -- SIGTERM
    }
    
    trap 'kill ${!}; term_handler' SIGTERM
    
    java ${heapOpt} \
    -Djava.security.egd=file:/dev/./urandom \
    -Dspring.profiles.active="${env}" \
    -Dspring.cloud.config.uri="${configserver}" \
    -Deureka.instance.ipAddress="${ipaddress}" \
    -Deureka.client.serviceUrl.defaultZone="${eurekadefaultzone}" \
    -jar /megatoi-certsvc-aws.jar &
    
    pid="$!"
    
    # wait forever
    while true
    do
      tail -f /dev/null & wait ${!}
    done