#!/bin/bash # ============================================================================== # PLM ILSHIN Docker 실행 스크립트 (Linux용) # ============================================================================== set -e # 오류 발생 시 스크립트 종료 # 색상 코드 정의 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 로그 함수 log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } log_step() { echo -e "${BLUE}[STEP]${NC} $1" } # 도움말 함수 show_help() { cat << EOF WACE PLM Docker 실행 스크립트 (Linux용) 사용법: $0 [OPTION] 옵션: -e, --env ENV 환경 설정 (dev|prod) [기본값: dev] -c, --clean Docker 시스템 정리 실행 -r, --restart 컨테이너 재시작 (중지 후 시작) -s, --stop 컨테이너 중지 -l, --logs 컨테이너 로그 확인 -h, --help 도움말 출력 예시: $0 # 개발환경 실행 $0 -e dev # 개발환경 실행 $0 -e prod # 운영환경 실행 $0 -e dev -c # 개발환경 실행 (Docker 정리 포함) $0 -s # 컨테이너 중지 $0 -l # 로그 확인 EOF } # 시스템 체크 check_system() { log_step "시스템 환경 체크 중..." # OS 확인 if [[ "$(uname -s)" != "Linux" ]]; then log_error "이 스크립트는 Linux 환경에서만 실행됩니다." log_error "현재 OS: $(uname -s)" exit 1 fi # Docker 설치 확인 if ! command -v docker &> /dev/null; then log_error "Docker가 설치되지 않았습니다." log_error "Docker 설치 후 다시 시도하세요." exit 1 fi # Docker Compose 설치 확인 if ! command -v docker-compose &> /dev/null; then log_error "Docker Compose가 설치되지 않았습니다." log_error "Docker Compose 설치 후 다시 시도하세요." exit 1 fi # Docker 서비스 상태 확인 (WSL2 + Docker Desktop 환경) if ! docker info &> /dev/null; then log_warn "Docker 서비스가 실행되지 않았습니다." log_warn "Windows에서 Docker Desktop을 시작해주세요." exit 1 fi log_info "시스템 환경 체크 완료" } # 환경 변수 로드 load_env_vars() { local env_file=".env.$1" if [ -f "$env_file" ]; then log_info "환경 변수 로드 중: $env_file" set -a source "$env_file" set +a export NODE_ENV="$1" else log_error "환경 변수 파일을 찾을 수 없습니다: $env_file" exit 1 fi } # Docker 시스템 정리 clean_docker() { log_step "Docker 시스템 정리 중..." # 사용하지 않는 컨테이너, 이미지, 볼륨 정리 docker system prune -af docker image prune -af docker volume prune -af log_info "Docker 시스템 정리 완료" } # 컨테이너 중지 stop_containers() { log_step "컨테이너 중지 중..." if [ "$ENVIRONMENT" = "prod" ]; then docker-compose -f docker-compose.prod.yml down else docker-compose -f docker-compose.dev.yml down fi log_info "컨테이너 중지 완료" } # 컨테이너 시작 start_containers() { local compose_file if [ "$ENVIRONMENT" = "prod" ]; then compose_file="docker-compose.prod.yml" log_step "운영환경 컨테이너 시작 중..." # 운영환경의 경우 Git 업데이트 if [ -d ".git" ]; then log_info "Git 리포지토리 업데이트 중..." git reset --hard git checkout main if ! git fetch origin; then log_error "Git fetch 실패" exit 1 fi if ! git reset --hard origin/main; then log_error "Git reset 실패" exit 1 fi log_info "Git 업데이트 완료" fi else compose_file="docker-compose.dev.yml" log_step "개발환경 컨테이너 시작 중..." fi # 컨테이너 빌드 및 시작 docker-compose -f "$compose_file" up --build --force-recreate -d log_info "컨테이너 시작 완료" } # 컨테이너 상태 확인 check_status() { log_step "컨테이너 상태 확인 중..." if [ "$ENVIRONMENT" = "prod" ]; then docker-compose -f docker-compose.prod.yml ps else docker-compose -f docker-compose.dev.yml ps fi } # 로그 확인 show_logs() { log_step "컨테이너 로그 확인 중..." if [ "$ENVIRONMENT" = "prod" ]; then docker-compose -f docker-compose.prod.yml logs -f else docker-compose -f docker-compose.dev.yml logs -f fi } # 메인 실행 함수 main() { local ENVIRONMENT="dev" local CLEAN_DOCKER=false local RESTART=false local STOP_ONLY=false local SHOW_LOGS=false # 인자 파싱 while [[ $# -gt 0 ]]; do case $1 in -e|--env) ENVIRONMENT="$2" shift 2 ;; -c|--clean) CLEAN_DOCKER=true shift ;; -r|--restart) RESTART=true shift ;; -s|--stop) STOP_ONLY=true shift ;; -l|--logs) SHOW_LOGS=true shift ;; -h|--help) show_help exit 0 ;; *) log_error "알 수 없는 옵션: $1" show_help exit 1 ;; esac done # 환경 검증 if [[ "$ENVIRONMENT" != "dev" && "$ENVIRONMENT" != "prod" ]]; then log_error "유효하지 않은 환경: $ENVIRONMENT (dev 또는 prod만 허용)" exit 1 fi log_info "PLM ILSHIN Docker 실행 스크립트 시작" log_info "환경: $ENVIRONMENT" # 시스템 체크 check_system # 환경 변수 로드 if [ "$ENVIRONMENT" = "prod" ]; then load_env_vars "production" else load_env_vars "development" fi # 로그만 확인하는 경우 if [ "$SHOW_LOGS" = true ]; then show_logs exit 0 fi # 컨테이너 중지만 하는 경우 if [ "$STOP_ONLY" = true ]; then stop_containers exit 0 fi # 재시작 또는 일반 시작 if [ "$RESTART" = true ]; then stop_containers fi # Docker 정리 if [ "$CLEAN_DOCKER" = true ]; then clean_docker fi # 컨테이너 시작 start_containers # 상태 확인 check_status log_info "PLM ILSHIN Docker 실행 완료!" log_info "애플리케이션 접속:" if [ "$ENVIRONMENT" = "prod" ]; then log_info " - https://ilshin.esgrin.com" log_info " - https://autoclave.co.kr" else log_info " - http://localhost:8090" fi log_info "로그 확인: $0 -l" log_info "컨테이너 중지: $0 -s" } # 스크립트 실행 main "$@"