DevOps

[docker-compose] SpringBoot Application 배포 스크립트(docker-compose 버전) 와탭(Whatap)설정 추가

nineDeveloper 2020. 5. 3.
728x90

와탭 설정


1. 와탭 해당 프로젝트 생성 후 라이센스 발급

와탭 프로젝트 리스트: https://service.whatap.io/v2/account/project/list

라이센스 발급 상세 경로

WHATAP 해당 프로젝트 > 관리 > 에이전트 설치 > 2. 와탭 에이전트 다운로드 참조


2. 발급받은 라이센스 정보를 auto_apply.sh에 입력

auto_apply.sh 설정 사항중 아래의 설정 부분에 라이센스 정보 입력

## WHATAP 해당 프로젝트 > 관리 > 에이전트 설치 > 2. 와탭 에이전트 다운로드 참조
## WHATAP 라이센스 (WHATAP 셋팅시 라이센스 값이 없으면 PASS함)
WHATAP_LICENSE=""
## WHATAP 서버 호스트 (WHATAP 셋팅시 라이센스 값이 없으면 PASS함)
WHATAP_SERVER_HOST=""

Sample

## WHATAP 해당 프로젝트 > 관리 > 에이전트 설치 > 2. 와탭 에이전트 다운로드 참조
## WHATAP 라이센스 (WHATAP 셋팅시 라이센스 값이 없으면 PASS함)
WHATAP_LICENSE="x4cbd219qitge-xxxxxxxxxxxxxxxxxxxxxxxxxxxxi"
## WHATAP 서버 호스트 (WHATAP 셋팅시 라이센스 값이 없으면 PASS함)
WHATAP_SERVER_HOST="13.124.11.223/13.209.172.35"

3. WHATAP_OPTS 옵션지정

상세 옵션 참조: https://service.whatap.io/docs/apm_install_guide.pdf

2번에서 WHATAP_LICENSEWHATAP_SERVER_HOST 가 정상적으로 지정되었으면
아래의 WHATAP_OPTSexport 하여 Application 구동시 Whatap Agent 옵션을 추가하여 구동한다

2번에서 WHATAP_LICENSEWHATAP_SERVER_HOST지정되지 않으면 Application 구동시 Whatap Agent 옵션을 추가 하지 않는다

기본 이름지정

Dwhatap.name=${SERVICE_NAME}-${SERVER_IP}-${HOST_PORT}" 이렇게 지정하면
에이전트 명은 oss-api-52.78.123.117-80으로 지정하는 대로 그대로 표현된다

오브젝트 에이전트 이름 지정

-Dwhatap.oname=${SERVICE_NAME}-{ip3}-{port} Whatap에서 지원되는 오브젝트를 사용하여 이름을 지정하는 옵션이다

마이크로서비스 지정옵션(이름을 길게 지정하지 않을때 이옵션으로 지정)

Dwhatap.okind=${SERVICE_NAME} 이 옵션은 마이크로 서비스에서 권장하는 옵션이다
oss-api-2-0 이런식으로 표현된다

Active Agent 추가 옵션

하나의 라이센스로 다수의 Active Agent를 추가하는 옵션
아래의 옵션을 지정하면 WhatapActive Agent가 정상적으로 추가된다
Agent Active 추가옵션: -Dwhatap.micro.enabled=true

## WHATAP JAVA OPT (java 어플리케이션 실행시 와탭옵션을 추가 한다 사용하지 않으면 주석 처리)
## 상세 옵션 참조: https://service.whatap.io/docs/apm_install_guide.pdf
## 기본 이름지정: -Dwhatap.name=${SERVICE_NAME}-${SERVER_IP}-${HOST_PORT}
## 오브젝트 이름지정: -Dwhatap.oname=${SERVICE_NAME}-{ip3}-{port}
## 마이크로서비스 지정옵션(이름을 길게 지정하지 않을때 이옵션으로 지정): -Dwhatap.okind=${SERVICE_NAME}
## Agent Active 추가옵션: -Dwhatap.micro.enabled=true
WHATAP_OPTS="-javaagent:${WHATAP_AGENT} -Dwhatap.micro.enabled=true -Dwhatap.name=${SERVICE_NAME}-${SERVER_IP}-${HOST_PORT}"

4. WHATAP을 사용하지 않을 때 Dockerfile 동작

라이센스가 입력되지 않으면 WHATAP관련 Environmemt들을 export되지 않도록 처리하여
자동으로 WHATAP 에이전트를 사용하지 않도록 처리됨

라이센스가 입력 되었을 경우에만 아래의 스크립트가 동작하여 WHATAP관련 Environmemt들을 export

    ## WHATAP 라이센스 여부 판단 후 라이센스가 입력되어있을때만 진행
    if [ ! -z ${WHATAP_LICENSE} ] && [ ! -z ${WHATAP_SERVER_HOST} ];then
      echo "=== WHATAP SETTING START ==="
      ...
      export WHATAP_OPTS=${WHATAP_OPTS}
      export WHATAP_AGENT=${WHATAP_AGENT}
      export WHATAP_CONF=${WHATAP_CONF}
      echo "=== WHATAP SETTING END ==="
    else
      echo "=== WHATAP LICENSE NONE WHATAP SETTING PASS ==="
      echo "whatap_dummy" > "whatap_dummy"
      echo "whatap_dummy created!!"
    fi

WHATAP 모니터링을 사용하지 않는 Applicationwhatap_dummy 파일이 ADD 되게 하였으며

ENV WHATAP_AGENT=${WHATAP_AGENT:-whatap_dummy}
ENV WHATAP_CONF=${WHATAP_CONF:-whatap_dummy}
...
## whatap 추가
ADD ${WHATAP_AGENT} ./
ADD ${WHATAP_CONF} ./

권한 설정도 if 문으로 설정 내용이 있을때만 처리 되도록 하였으므로 별도로 처리할 부분은 없음

## whatap 파일 소유자와 그룹 USER로 변경처리
RUN if [ "${WHATAP_AGENT}" ];then sudo chown ${CURRENT_UID}:${CURRENT_UID} ${WHATAP_AGENT}; fi
RUN if [ "${WHATAP_CONF}" ];then sudo chown ${CURRENT_UID}:${CURRENT_UID} ${WHATAP_CONF}; fi

* 참고

어플리케이션 서버가 2대일 경우 라이센스 정보를 적용한다.


jar 파일 Docker 적용 스크립트

CI를 통해 생성된 jar 파일에 대해 docker-composeDockerfile을 빌드하여
Docker 이미지 생성 및 컨테이너를 생성하여 서버를 구동하는 스크립트

스크립트 처리를 위해 CI를 통해 생성된 jar파일을 $APPLICATION_NAME 파일명으로 복사하여 $IMAGE_NAME:$VERSION로 이미지를 생성

매 수행시 마다 docker-compose down 을 통해 이미지를 제거하고 docker-compose up으로
이미지를 재생성 처리 한다

사용방법

먼저 서비스 경로의 아래의 Dockerfile, docker-compose.yml, auto_apply.sh 파일을 생성한다

auto_apply.sh 파일은 상단의 env 속성 값을 해당 서비스에 맞게 설정 해준다

그리고 CI를 통해 배포된 경로 /home/centos/app 경로에 각 스크립트 파일을 실행하면 된다

$ ./auto_apply.sh

예시

$ ./auto_apply.sh

Dockerfile(개발용)

FROM azul/zulu-openjdk:14

ARG APPLICATION_HOME
ARG APPLICATION_NAME
ARG DEPLOY_NAME
ARG SPRING_PROFILE
ARG CURRENT_UID
ARG GID
ARG USER
ARG WHATAP_AGENT
ARG WHATAP_CONF
ARG WHATAP_OPTS

# 언어 설정
RUN apt-get update && apt-get install -y language-pack-ko && \
    apt-get -y install sudo
RUN locale-gen ko_KR.UTF-8
RUN update-locale LC_ALL=ko_KR.UTF-8 LANG=ko_KR.UTF-8
#ENV LANG ko_KR.UTF-8
#ENV LANGUAGE ko_KR.UTF-8
#ENV LC_ALL ko_KR.UTF-8

ENV APPLICATION_HOME=${APPLICATION_HOME}
ENV APPLICATION_NAME=${APPLICATION_NAME:-app.jar}
ENV DEPLOY_NAME=${DEPLOY_NAME:-deploy.jar}
ENV SPRING_PROFILE=${SPRING_PROFILE:-dev}
ENV WHATAP_AGENT=${WHATAP_AGENT:-whatap_dummy}
ENV WHATAP_CONF=${WHATAP_CONF:-whatap_dummy}
ENV WHATAP_OPTS=${WHATAP_OPTS}

# TimeZone 설정
ENV TZ=Asia/Seoul
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

RUN echo "CURRENT_UID = ${CURRENT_UID}" \
    echo "GID = ${GID}" \
    echo "USER = ${USER}"

## 유저 및 그룹추가 sudo 추가
RUN groupadd --gid ${CURRENT_UID} ${USER} \
    && useradd --uid ${CURRENT_UID} --gid ${CURRENT_UID} --create-home ${USER} \
    && adduser ${USER} sudo \
    && echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

## 유저 설정
USER ${CURRENT_UID}:${CURRENT_UID}
## 작업 디렉토리 설정
WORKDIR /home/${USER}

RUN mkdir iparking iparking/dump tmpfiles files

## app 추가
ADD ${DEPLOY_NAME} ${APPLICATION_NAME}

## whatap 추가
ADD ${WHATAP_AGENT} ./
ADD ${WHATAP_CONF} ./
## whatap 파일 소유자와 그룹 USER로 변경처리
RUN if [ "${WHATAP_AGENT}" ];then sudo chown ${CURRENT_UID}:${CURRENT_UID} ${WHATAP_AGENT}; fi
RUN if [ "${WHATAP_CONF}" ];then sudo chown ${CURRENT_UID}:${CURRENT_UID} ${WHATAP_CONF}; fi

## app 소유자와 그룹 USER로 변경처리
RUN sudo chown ${CURRENT_UID}:${CURRENT_UID} ${APPLICATION_NAME}

ENV JAVA_OPTS="${WHATAP_OPTS} -jar ${APPLICATION_NAME} -Duser.timezone=Asia/Seoul --spring.profiles.active=${SPRING_PROFILE} -Djava.io.tmpdir=tmpfiles"
RUN echo ${JAVA_OPTS}

RUN echo "APPLICATION_NAME = ${APPLICATION_NAME}"
RUN echo "DEPLOY_NAME = ${DEPLOY_NAME}"

## app 구동
CMD java ${JAVA_OPTS}

Dockerfile (운영용) - HeapDump, Whatap 옵션 추가

FROM azul/zulu-openjdk:14

ARG APPLICATION_HOME
ARG APPLICATION_NAME
ARG DEPLOY_NAME
ARG SPRING_PROFILE
ARG CURRENT_UID
ARG GID
ARG USER
ARG WHATAP_AGENT
ARG WHATAP_CONF
ARG WHATAP_OPTS

# 언어 설정
RUN apt-get update && apt-get install -y language-pack-ko && \
    apt-get -y install sudo
RUN locale-gen ko_KR.UTF-8
RUN update-locale LC_ALL=ko_KR.UTF-8 LANG=ko_KR.UTF-8
#ENV LANG ko_KR.UTF-8
#ENV LANGUAGE ko_KR.UTF-8
#ENV LC_ALL ko_KR.UTF-8

ENV APPLICATION_HOME=${APPLICATION_HOME}
ENV APPLICATION_NAME=${APPLICATION_NAME:-app.jar}
ENV DEPLOY_NAME=${DEPLOY_NAME:-deploy.jar}
ENV SPRING_PROFILE=${SPRING_PROFILE:-dev}
ENV WHATAP_AGENT=${WHATAP_AGENT:-whatap_dummy}
ENV WHATAP_CONF=${WHATAP_CONF:-whatap_dummy}
ENV WHATAP_OPTS=${WHATAP_OPTS}

# TimeZone 설정
ENV TZ=Asia/Seoul
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

RUN echo "CURRENT_UID = ${CURRENT_UID}" \
    echo "GID = ${GID}" \
    echo "USER = ${USER}"

## 유저 및 그룹추가 sudo 추가
RUN groupadd --gid ${CURRENT_UID} ${USER} \
    && useradd --uid ${CURRENT_UID} --gid ${CURRENT_UID} --create-home ${USER} \
    && adduser ${USER} sudo \
    && echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

## 유저 설정
USER ${CURRENT_UID}:${CURRENT_UID}
## 작업 디렉토리 설정
WORKDIR /home/${USER}

RUN mkdir iparking iparking/dump tmpfiles files

## app 추가
ADD ${DEPLOY_NAME} ${APPLICATION_NAME}

## whatap 추가
ADD ${WHATAP_AGENT} ./
ADD ${WHATAP_CONF} ./
## whatap 파일 소유자와 그룹 USER로 변경처리
RUN if [ "${WHATAP_AGENT}" ];then sudo chown ${CURRENT_UID}:${CURRENT_UID} ${WHATAP_AGENT}; fi
RUN if [ "${WHATAP_CONF}" ];then sudo chown ${CURRENT_UID}:${CURRENT_UID} ${WHATAP_CONF}; fi

## app 소유자와 그룹 USER로 변경처리
RUN sudo chown ${CURRENT_UID}:${CURRENT_UID} ${APPLICATION_NAME}

ENV JAVA_OPTS="${WHATAP_OPTS} -jar ${APPLICATION_NAME} -Duser.timezone=Asia/Seoul --spring.profiles.active=${SPRING_PROFILE} -Djava.io.tmpdir=tmpfiles -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=iparking/dump"
RUN echo ${JAVA_OPTS}

RUN echo "APPLICATION_NAME = ${APPLICATION_NAME}"
RUN echo "DEPLOY_NAME = ${DEPLOY_NAME}"

## app 구동
CMD java ${JAVA_OPTS}

docker-compose.yml

Docker 빌드와 컨테이너 구동 정지, 이미지 생성 제거를 쉽게 처리할 수 있도록 docker-compose 를 사용한다
모든 env 속성값은 auto_apply.sh 에 설정한 env 속성값을 전달 받도록 되어있다

## docker-compose 버전 3버전의 최신버전을 셋팅
version: '3'

services:
  ## 서비스명 docker-compose up -d [서비스명] 으로
  ## 여러 서비스가 있으면 해당 서비스만 구동할 수 있다
  ## 서비스명이 중복되면 오류가 발생하므로 서비스되는 서비스명으로 변경 해야 한다
  ## SERVICE 명(jar 파일 이름 앞자리와 동일해야함, docker-compose '서비스명-profile'과 같아야함 ex - service-dev)
  서비스명-profile:
    build:
        ## 현재 디렉토리의 Dockerfile을 빌드
        context: .
        ## auto_apply.sh 스크립트에서 설정한 env 속성값을 Dockerfile에 전달한다
        ## 이름과 env 명이 같다면 아래와 같이 값을 대입하지 않아도 된다
        args:
          - APPLICATION_HOME
          - APPLICATION_NAME
          - DEPLOY_NAME
          - SPRING_PROFILE
          - CURRENT_UID
          - GID
          - USER
          - WHATAP_AGENT
          - WHATAP_CONF
          - WHATAP_OPTS
    ## 빌드시 생성되는 이미지명과 태그명을 auto_apply.sh 로부터 전달 받아서 지정한다
    image: "${IMAGE_NAME}:${VERSION}"
    ## 컨테이너 명을 auto_apply.sh 로부터 전달 받아서 지정한다
    #container_name: "${IMAGE_NAME}"
    ## 항상 재기동되는 옵션
    restart: always
    ## HOST 포트와 컨테이너 포트를 auto_apply.sh 로부터 전달 받아서 지정한다
    ports:
        - "${HOST_PORT}:${CONTAINER_PORT}"
    ## 컨테이너만 공개하는 포트
    expose:
        - "${CONTAINER_PORT}"
    user: "${CURRENT_UID}:${CURRENT_UID}"
    ## Docker 컨테이너와 HOST 디렉토리를 맵핑
    volumes:
        - '${APPLICATION_HOME}/log:/home/${USER}/log'
        - '${APPLICATION_HOME}/monitering_log:/home/${USER}/logs'
        - '${APPLICATION_HOME}/iparking:/home/${USER}/iparking:rw'
        - '${APPLICATION_HOME}/tmpfiles:/home/${USER}/tmpfiles'
        - '${FILE_UPLOAD_PATH}:/home/${USER}/files:rw'
        - '/etc/localtime:/etc/localtime:ro'
    ## 한국 시간 설정
    environment:
        TZ: "Asia/Seoul"

auto_apply.sh

메인 자동 적용 스크립트 각 서비스에 맞게 env 속성 값을 변경 하여야 올바르게 적용된다

# 소스 도커 자동적용 및 자동 컨테이너 시작 스크립트
# 사용예시
#  Dockerfile에 명시된 파일명으로 변환하여 도커 컨테이너로 기동
# ./auto_apply.sh

## 배포 전용 jar 파일 (원본 jar 파일을 COPY 하여 배포를 진행한다)
export DEPLOY_NAME="deploy.jar"

export CURRENT_UID=`id -u`
export GID=`id -g`
export USER=${USER}

if [ ! ${CURRENT_UID} ];then
  export CURRENT_UID=1000
fi

echo "CURRENT_UID = ${CURRENT_UID}"
echo "GID = ${GID}"
echo "USER = ${USER}"

## HOME 디렉토리 명
HOME_DIRECTORY="centos"

## SERVICE DIRECTORY(현재 서비스 디렉토리명)
SERVICE_DIRECTORY="service"

## SERVICE 명(jar 파일 이름 앞자리와 동일해야함, docker-compose '서비스명-profile'과 같아야함)
## Docker 컨테이명이기도 하므로 FULL NAME으로 작성
SERVICE_NAME="service"

## Spring Profile(dev, stage, prod)
export SPRING_PROFILE="dev"

## 외부에 제공되는 포트 (Docker 컨테이너 장점으로 HOST 포트만 변경하여 다른 포트로 제공할 수 있다)
export HOST_PORT=80
## Docker Container 포트 (컨테이너 포트는 9001 Application 의 포트이다)
export CONTAINER_PORT=9001

## Tag 버전명
export VERSION="lts"

## IMAGE 명
export IMAGE_NAME="${SERVICE_NAME}-${SPRING_PROFILE}"

export APPLICATION_HOME="/home/${HOME_DIRECTORY}/${SERVICE_DIRECTORY}"
export APPLICATION_NAME="${SERVICE_NAME}.jar"

## File 업로드 디렉토리
export FILE_UPLOAD_PATH="${APPLICATION_HOME}/files"

## 공인IP
SERVER_IP=`curl ifconfig.me`

## WHATAP 에이전트 jar 파일 (원본 jar 파일을 COPY 하여 적용)
WHATAP_AGENT="whatap.agent.jar"

## WHATAP CONF 파일명
WHATAP_CONF="whatap.conf"

## WHATAP JAVA OPT (java 어플리케이션 실행시 와탭옵션을 추가 한다 사용하지 않으면 주석 처리)
## 상세 옵션 참조: https://service.whatap.io/docs/apm_install_guide.pdf
## 기본 이름지정: -Dwhatap.name=${SERVICE_NAME}-${SERVER_IP}-${HOST_PORT}
## 오브젝트 이름지정: -Dwhatap.oname=${SERVICE_NAME}-{ip3}-{port}
## 마이크로서비스 지정옵션(이름을 길게 지정하지 않을때 이옵션으로 지정): -Dwhatap.okind=${SERVICE_NAME}
## Agent Active 추가옵션: -Dwhatap.micro.enabled=true
WHATAP_OPTS="-javaagent:${WHATAP_AGENT} -Dwhatap.micro.enabled=true -Dwhatap.name=${SERVICE_NAME}-${SERVER_IP}-${HOST_PORT}"

## WHATAP 해당 프로젝트 > 관리 > 에이전트 설치 > 2. 와탭 에이전트 다운로드 참조
## WHATAP 라이센스 (WHATAP 셋팅시 라이센스 값이 없으면 PASS함)
WHATAP_LICENSE=""
## WHATAP 서버 호스트 (WHATAP 셋팅시 라이센스 값이 없으면 PASS함)
WHATAP_SERVER_HOST=""

## 어플리케이션 와탭 경로
WHATAP_HOME="${APPLICATION_HOME}/whatap"

cd ${APPLICATION_HOME}
FILE_NAME=`ls ${SERVICE_NAME}*.jar -ltr | tail -1 | awk '{ print $9 }'`
echo 'AUTO APPLY FILE_NAME: '$FILE_NAME

echo "======= 경로확인 ======="
echo "pwd"
pwd
echo "======= START ======="
if [ $FILE_NAME ];then
  if [ -f $FILE_NAME ];then

    echo "0. make initialize"
    if [ ! -d "files" ];then
      echo "mkdir files"
      mkdir "files"
    fi
    if [ ! -d "iparking" ];then
      echo "mkdir iparking"
      mkdir "iparking"
    fi
    if [ ! -d "log" ];then
      echo "mkdir log"
      mkdir "log"
    fi
    if [ ! -d "monitering_log" ];then
      echo "mkdir monitering_log"
      mkdir "monitering_log"
    fi
    if [ ! -d "tmpfiles" ];then
      echo "mkdir tmpfiles"
      mkdir "tmpfiles"
    fi

    ## WHATAP 라이센스 여부 판단 후 라이센스가 입력되어있을때만 진행
    #if [[ ${WHATAP_LICENSE} ]] && [[ ${WHATAP_SERVER_HOST} ]];then
    if [ ! -z ${WHATAP_LICENSE} ] && [ ! -z ${WHATAP_SERVER_HOST} ];then
      echo "=== WHATAP SETTING START ==="
      ## WHATAP 에이전트 파일 다운로드
      if [ ! -d "whatap" ];then
         echo "wget https://service.whatap.io/agent/whatap.agent.java.tar.gz"
         wget https://service.whatap.io/agent/whatap.agent.java.tar.gz
         echo "tar -xvzf whatap.agent.java.tar.gz"
         tar -xvzf whatap.agent.java.tar.gz
         #wget -P whatap  https://s3.ap-northeast-2.amazonaws.com/repo.whatap.io/maven/io/whatap/whatap.agent/2.0_13/whatap.agent-2.0_13.jar
      fi

      ## 배포용 WHATAP 에이전트 파일생성
      echo "whatap agent file check"
      if [ ! -f ${WHATAP_AGENT} ];then
         ## WHATAP 파일 경로
         WHATAP_ORIGINAL_FILE_NAME=`ls ${WHATAP_HOME}/whatap.agent-*.jar -ltr | tail -1 | awk '{ print $9 }'`
         echo "${WHATAP_ORIGINAL_FILE_NAME} file copy ..."
         cp ${WHATAP_ORIGINAL_FILE_NAME} ${WHATAP_AGENT}
      fi

      ## WHATAP CONF 파일 생성
      if [ ! -f ${WHATAP_CONF} ];then
         echo "== whatap.conf create =="
         echo license=${WHATAP_LICENSE} > ${WHATAP_CONF}
         echo whatap.server.host=${WHATAP_SERVER_HOST} >> ${WHATAP_CONF}
         echo tx_caller_meter_enabled=true >> ${WHATAP_CONF}
         echo sql_dbc_meter_enabled=true >> ${WHATAP_CONF}
         echo httpc_host_meter_enabled=true >> ${WHATAP_CONF}
         echo actx_meter_enabled=true >> ${WHATAP_CONF}
      fi
      echo "== whatap.conf =="
      cat ${WHATAP_CONF}
      echo "== WHATAP_OPTS setting =="
      echo "${WHATAP_OPTS}"
      export WHATAP_OPTS=${WHATAP_OPTS}
      export WHATAP_AGENT=${WHATAP_AGENT}
      export WHATAP_CONF=${WHATAP_CONF}
      echo "=== WHATAP SETTING END ==="
    else
      echo "=== WHATAP LICENSE NONE WHATAP SETTING PASS ==="
      echo "whatap_dummy" > "whatap_dummy"
      echo "whatap_dummy created!!"
    fi

    ## 예전 배포 전용 jar 파일이 남아있다면 제거하고 현재 배포할 파일을 배포 전용 jar 파일로 COPY 한다
    echo "1. remove previous $DEPLOY_NAME"
    if [ -f $DEPLOY_NAME ];then

      echo "EXIST $DEPLOY_NAME -----------------"
      echo "2. rename $FILE_NAME -> $DEPLOY_NAME"
      EXIST_COUNT=`ls *.jar | grep -v "$DEPLOY_NAME" | wc -l`
      echo "EXIST_COUNT=$EXIST_COUNT"
      if [ $EXIST_COUNT -gt 0 ];then
        echo "rm $DEPLOY_NAME"
        rm $DEPLOY_NAME
        echo "cp $FILE_NAME $DEPLOY_NAME"
        cp $FILE_NAME $DEPLOY_NAME
      fi
    ## 현재 배포할 파일을 배포 전용 jar 파일로 COPY 한다
    else
      echo "NOT EXIST $DEPLOY_NAME--------------"
      echo "2. rename $FILE_NAME -> $DEPLOY_NAME"
      EXIST_COUNT=`ls *.jar | grep -v "$DEPLOY_NAME" | wc -l`
      echo "EXIST_COUNT=$EXIST_COUNT"
      if [ $EXIST_COUNT -gt 0 ];then
        echo "cp $FILE_NAME $DEPLOY_NAME"
        cp $FILE_NAME $DEPLOY_NAME
      fi
    fi

    echo "---------------------"
    echo "3. docker-compose down"
    ## 컨테이너ID 조회
    CONTAINER_ID=`docker ps -af ancestor=${IMAGE_NAME}:${VERSION} --format "{{.ID}}"`
    echo "CONTAINER_ID=${CONTAINER_ID}"
    CONTAINER_NAME_ID=`docker ps --filter "name=${IMAGE_NAME}" --format "{{.ID}}"`
    echo "CONTAINER_NAME_ID=${CONTAINER_NAME_ID}"
    ## 컨테이너ID 가 있으면 docker-compose down 으로 컨테이너를 중지 및 제거한다
    if [ ${CONTAINER_ID} ];then
      ## 동일한 컨테이너 명이 있으면 해당 docker-compose 로 해당 서비스만 제거한다
      ## -f, --force Don't ask to confirm removal
      ## -s, --stop Stop the containers, if required, before removing
      ## -v Remove any anonymous volumes attached to containers
      echo "docker-compose rm -fsv ${IMAGE_NAME}"
      docker-compose rm -fsv ${IMAGE_NAME}
    elif [ ${CONTAINER_NAME_ID} ];then
      echo "docker rm ${CONTAINER_NAME_ID}"
      docker rm ${CONTAINER_NAME_ID} -f
    else
      echo "CONTAINER is Empty pass..."
    fi

    CONTAINER_ID=`docker ps -af ancestor=${IMAGE_NAME}:${VERSION} --format "{{.ID}}"`
    echo "CONTAINER_ID=${CONTAINER_ID}"
    ## 컨테이너ID 를 다시 확인해서 아직 있으면 컨테이너와 이미지를 강제 삭제한다
    if [ ${CONTAINER_ID} ];then
      echo "docker rm ${CONTAINER_ID}"
      docker rm ${CONTAINER_ID} -f
      ## 이미지ID 조회
      IMAGE_ID=`docker images -f=reference=${IMAGE_NAME}':*' --format "{{.ID}}"`
      echo "IMAGE_ID=$IMAGE_ID"
      ## 이미지ID 가 있으면 이미지도 제거한다(docker-compose up --build 로 이미지 rebuild)
      if [ $IMAGE_ID ];then
        echo "docker rmi -f $IMAGE_ID"
        docker rmi -f $IMAGE_ID
      fi
    fi

    echo "---------------------"
    echo "4. Docker image remove"
    ## 이미지ID 조회
    IMAGE_ID=`docker images -f=reference=${IMAGE_NAME}':*' --format "{{.ID}}"`
    echo "IMAGE_ID=$IMAGE_ID"
    ## 이미지ID 가 있으면 구버전 이미지를 제거한다(docker-compose up --build 로 이미지 rebuild)
    #if [ $IMAGE_ID ];then
      #echo "docker rmi -f $IMAGE_ID"
      #docker rmi -f $IMAGE_ID
    #else
      #echo "IMAGE is Empty pass..."
    #fi
    echo "---------------------"
    ## docker-compose up으로 새롭게 Dockerfile을 빌드하고 컨테이너 및 이미지를 생성한다
    echo "5. docker-compose up"
    echo "docker-compose up --build -d"
    docker-compose up --build -d
    #docker-compose logs -f

    ## 이름없는모든 이미지 삭제
    echo "docker image prune -f"
    docker image prune -f
    ## 중지된 모든 컨테이너 삭제
    echo "docker container prune -f"
    docker container prune -f

    ## 배포 전용 jar 파일 제거
    echo "rm $DEPLOY_NAME"
    rm $DEPLOY_NAME
    echo "rm -rf whatap*"
    rm -rf whatap*

    ## 하루 지난 파일은 삭제
    #find $APPLICATION_HOME/*.jar -ctime +0 -exec rm -f {} \;
    ## 7일 지난 파일은 삭제
    find $APPLICATION_HOME/*.jar -ctime +7 -exec rm -f {} \;
    ## 두시간 지난 파일은 삭제
    #find $APPLICATION_HOME/*.jar -cmin +120 -exec rm -f {} \;

    echo "======= Complete ======="
  else
    echo "$FILE_NAME is not Exist"
    echo "======= FAIL ======="
  fi
else
  echo "FILE_NAME is Empty input FILE_NAME please .. "
  echo "======= FAIL ======="
fi
728x90

댓글

💲 추천 글