
Docker를 사용해서 서버를 돌리게 되면서 healthcheck 스크립트를 Docker용으로 다시 작성해야했다.
(기존에는 window 스케쥴러를 등록하여 1분마다 해당 스크립트를 돌리도록 했음)
코드 자체는 매우 간단했지만 docker에 대해 알아가면서 짜다보니 시간을 많이 잡아먹었다.
서버로 api요청을 보낸 후 응답이 비정상적일 경우 컨테이너를 종료하고 다시 시작하는 healthcheck 스크립트를 작성하였다.
healthcheck_docker.sh
#!/bin/bash
LOG_FILE="/app/healthcheck.log"
TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S")
HEALTH_CHECK_URLS=(
"헬스체크 endpoint"
)
echo "$TIMESTAMP - Starting health check" >> $LOG_FILE
for URL in "${HEALTH_CHECK_URLS[@]}"; do
if ! curl --fail --connect-timeout 10 --max-time 30 "$URL" > /dev/null 2>&1; then
echo "$TIMESTAMP - Healthcheck FAILED for $URL" >> $LOG_FILE
kill 1 # 컨테이너 종료
exit 1
fi
done
echo "$TIMESTAMP - Healthcheck: OK"
exit 0 # 모두 성공
처음에는 Dockerfile에서 healthcheck를 돌렸으나 서비스 시작 과정이 귀찮아 docker compose를 사용하였다.
Dockerfile
Docker CLI 사용 시 코드에서 주석 처리한 것을 풀어주고 컨테이너를 실행할 때 restart 옵션을 통해서 재시작 가능
WORKDIR는 Docker 컨테이너 내에서의 작업 디렉토리이다.
FROM python:3.10
WORKDIR /app
COPY . .
RUN chmod +x /app/healthcheck_docker.sh && pip3 install --no-cache-dir -r requirements.txt
EXPOSE 5000
#HEALTHCHECK --interval=60s --timeout=40s --start-period=3s CMD /bin/bash /app/healthcheck_docker.sh
CMD ["python3","./app.py"]
Docker Compose
이 경우 Dockerfile에서 HEALTHCHECK부분을 삭제하거나 주석처리해주면 된다.
restart 옵션으로는 unless-stopped을 사용해 수동으로 컨테이너를 정지한게 아니라면 재시작하도록 세팅.
latest태그는 가장 최신 이미지를 사용하도록 한다고 하길래 나중에 버전 문제가 없도록 추가해줬다.
services:
app:
image: {이미지이름}:latest
restart: unless-stopped
ports:
- "5000:5000"
healthcheck:
test: ["CMD", "bash", "-c", "/app/healthcheck_docker.sh"]
interval: 60s
timeout: 40s
start_period: 10s
아래 명령어를 통해 실행할 수 있다.
docker-compose up
Problem & Solved
중간중간에 문제가 꽤나 있었는데 경로와 권한 문제였다. Docker 사용법이 익숙치않아서 발생한 문제들..
만약 컨테이너를 실행했는데 헬스체크가 제대로 동작하지 않는다면 container에서 직접 실행해보자
continer > View files를 통해서 오른쪽 화면으로 넘어갈 수 있음


이런식으로 직접 실행했을 때 권한 문제나 not found 경로 문제 이슈를 발견할 수 있었음
CRLF/LF 문제도 있었다.
Docker 컨테이너는 Linux 기반이기 때문에 LF 형식이었어야했는데 CRLF를 사용해서 오류가 발생했다..
Line Endings 호환성도 잘 확인하자
'내가 해냄' 카테고리의 다른 글
웹 성능 최적화(1) (0) | 2023.11.30 |
---|---|
캐러셀 구현하기(1) (1) | 2023.06.04 |
이메일 클릭 시 강제 복사 시키기 (0) | 2023.04.12 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!