와탭 설정
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_LICENSE
와 WHATAP_SERVER_HOST
가 정상적으로 지정되었으면
아래의 WHATAP_OPTS
를 export 하여 Application 구동시 Whatap Agent 옵션을 추가하여 구동한다
2번에서 WHATAP_LICENSE
와 WHATAP_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를 추가하는 옵션
아래의 옵션을 지정하면 Whatap 에 Active 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 모니터링을 사용하지 않는 Application은 whatap_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-compose
로 Dockerfile을 빌드하여
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
'DevOps' 카테고리의 다른 글
[Docker] Crontab 설치 (0) | 2020.09.03 |
---|---|
[docker-compose] 커맨드 (0) | 2020.08.16 |
[Docker] SpringBoot Application 배포 스크립트(docker 버전) (0) | 2020.05.01 |
[Jenkins] CI/CD 자동적용 설정 (0) | 2020.05.01 |
[Docker] 신규 인스턴스 Docker 환경 구성 (0) | 2020.05.01 |
댓글