1+ #! /bin/bash
2+ IMAGE=$1
3+
4+ if [ -z " $IMAGE " ]; then
5+ echo " >>> 사용법: ./deploy.sh <이미지명:태그>"
6+ exit 1
7+ fi
8+
9+ NETWORK=" app-network"
10+
11+ # 현재 활성 컨테이너 확인
12+ CURRENT=$( cat /home/ubuntu/app/current_container 2> /dev/null || echo " " )
13+
14+ if [ " $CURRENT " == " app-blue" ]; then
15+ NEW_CONTAINER=" app-green"
16+ OLD_CONTAINER=" app-blue"
17+ else
18+ NEW_CONTAINER=" app-blue"
19+ OLD_CONTAINER=" app-green"
20+ fi
21+
22+ echo " >>> 현재: ${OLD_CONTAINER:- 없음} → 새로운: $NEW_CONTAINER "
23+
24+ # 새 이미지 pull
25+ echo " >>> 이미지 pull 중..."
26+ docker pull $IMAGE
27+
28+ # 혹시 남아있는 동일 이름 컨테이너 정리
29+ docker stop $NEW_CONTAINER 2> /dev/null && docker rm $NEW_CONTAINER 2> /dev/null
30+
31+ # 새 컨테이너 실행 (네트워크 연결 없이)
32+ echo " >>> 새 컨테이너($NEW_CONTAINER ) 실행 중..."
33+ docker run -d --name $NEW_CONTAINER \
34+ -e SPRING_PROFILES_ACTIVE=prod \
35+ --health-cmd=" curl -f http://localhost:8080/actuator/health || exit 1" \
36+ --health-interval=5s \
37+ --health-timeout=3s \
38+ --health-start-period=30s \
39+ --health-retries=10 \
40+ $IMAGE
41+
42+ # 헬스체크 (docker inspect로 healthy 상태 확인)
43+ echo " >>> 헬스체크 시작..."
44+ for i in $( seq 1 60) ; do
45+ STATUS=$( docker inspect --format=' {{.State.Health.Status}}' $NEW_CONTAINER 2> /dev/null)
46+ if [ " $STATUS " == " healthy" ]; then
47+ echo " >>> 헬스체크 통과! (${i} 초)"
48+ break
49+ fi
50+ if [ $i -eq 60 ]; then
51+ echo " >>> 헬스체크 실패! 롤백합니다."
52+ docker stop $NEW_CONTAINER && docker rm $NEW_CONTAINER
53+ exit 1
54+ fi
55+ sleep 1
56+ done
57+
58+ # 새 컨테이너를 네트워크에 연결 (app alias 부여 → 이 순간 트래픽 전환)
59+ echo " >>> 트래픽 전환 중..."
60+ docker network connect --alias app $NETWORK $NEW_CONTAINER
61+
62+ # 이전 컨테이너 네트워크에서 분리 + 정리
63+ if [ -n " $CURRENT " ]; then
64+ echo " >>> 이전 컨테이너($OLD_CONTAINER ) 정리 중..."
65+ docker network disconnect $NETWORK $OLD_CONTAINER 2> /dev/null
66+ docker stop $OLD_CONTAINER 2> /dev/null && docker rm $OLD_CONTAINER 2> /dev/null
67+ fi
68+
69+ # 현재 컨테이너 기록
70+ echo $NEW_CONTAINER > /home/ubuntu/app/current_container
71+
72+ # 오래된 Docker 이미지 정리
73+ docker image prune -f
74+
75+ echo " >>> 배포 완료! 활성 컨테이너: $NEW_CONTAINER "
0 commit comments