docker healthcheck

 

DockerFile

 

FROM amazoncorretto:17-alpine

# 필요한 파일들과 jar COPY
COPY /target/front-0.0.1-SNAPSHOT.jar /app/front.jar

ENV LOG_FILE_PATH=/home/freet/logs/front/application.log

# curl 설치
RUN apk --no-cache add curl

# jar를 실행할 DIR로 이동
WORKDIR /app

# 이미지의 서버 포트는 고정
EXPOSE 8080

# jar 실행 blue&green 서버 포트 & profiles는 compose에서 조절
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}",  "-Dserver.port=8080", "front.jar"]

 

 

일반적인 도커파일을 작성합니다.

 

curl은 나중에 container 내부에서 health check를 하기 위해 apk를 사용해 add 합니다.

 

 

docker-compose.yml

 

# compose 명령어 docker-compose -f docker-compose.front.yml up -d
# compose 죽이기 docker-compose down

version: '3.4'

services:
  front:
    image: freet/front:latest
    environment:
      - SPRING_PROFILES_ACTIVE=dev
    ports:
      # 호스트포트:이미지포트
      - "8191:8080"
    volumes:
      - ./logs/front:./logs/front

    command: [ "/bin/sh", "-c", "if [ ! -d ./logs/front ]; then mkdir -p ./logs/front; fi" ]

    stdin_open: true # -i
    tty: true # -t

    healthcheck:
      test: [ "CMD", "curl", "-f", "http://localhost:8080/infra/health" ]
      interval: 10s
      timeout: 30s
      retries: 10
      start_period: 30s

 

 

healthcheck를 사용해 컨테이너 내부의 앱 상태를 체크합니다.

 

3.4 버전 이후 부턴 start_period를 사용해 30초 후부터 체크를 시작합니다. 이후 10초마다 test의 커맨드를 실행합니다.

 

이때 dockerfile에서 다운받은 curl을 사용해 uri에 curl을 날립니다.

 

 

container가 올라오고 inspect를 해보면 위와 같은 Health 속성에 기록이 남습니다.

interval과 retries에 해당하는 시도를 해보고 만약 성공한다면 healthy 모두 실패한다면 unhealty가 Status로 됩니다.

 

 

 

 

docker ps 를 통해 현재 컨테이너들의 상태를 쉽게 확인할 수 있습니다.

 

 

 

 

https://docs.docker.com/compose/compose-file/compose-file-v3/#healthcheck