- 이슈 : 도커 컨테이너내 어플리케이션이 도커가 종료시 종료 시그널을 받지 못함.
- 영향 : 유레카 클라이언트가 돌고 있는 어플리케이션이라 서비스 종료시 유레카 클라이언트 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