본문 바로가기
#IT 업무노트

[Cluster 전환 #10] Dockerfile을 사용하여 Maven 빌드 시에 소스 코드 수정이 제대로 반영되지 않는 현상

by 꾸미라기 2024. 7. 26.
반응형
SMALL

Dockerfile을 사용하여 Maven 빌드 시에 소스 코드 수정이 제대로 반영되지 않는 문제는 일반적으로 Docker의 캐시 메커니즘 때문에 발생할 수 있습니다. 
Docker는 이미지 빌드 과정에서 캐시를 사용하여 중복된 단계를 최소화하려고 합니다. 
이로 인해 Docker는 빌드 컨텍스트 내에서 변경된 파일만을 인식하지 못할 수 있습니다.
만약 소스 코드 (src 디렉토리) 안에 class 디렉토리가 이미 포함되어 있고,
이를 Docker 빌드 시에 Maven 빌드에서 제외하고자 한다면, 
Dockerfile에서 Maven 빌드 단계에서 이 디렉토리를 제외시키는 방법을 사용할 수 있습니다. 
보통 Maven은 소스 코드를 컴파일하고 빌드할 때 target 디렉토리에 클래스 파일을 생성하지만, 
때때로 소스 코드 자체에 클래스 파일이 이미 포함되어 있을 수 있습니다.
아래 예시를 통해 Dockerfile에서 클래스 파일이 이미 포함된 src/class 디렉토리를 제외하는 방법을 공유하겠습니다.

2024.07.26 - [#IT 업무노트] - [Cluster 전환 #9] 프록시 서버 구성하기

 

[Cluster 전환 #9] 프록시 서버 구성하기

아래 두 가지 연계 건으로 방화벽 OPEN시 프록시 서버 구축 요청을 받았습니다. 1. WIPS 전세계 특허 정보 API 연계 2. 공통API 인증 서버 연계 방화벽 open시에는 소스IP A, 타겟IP C, 

ggumidr.com

2024.06.29 - [#IT 업무노트] - [Cluster 전환 #8] Network Policy 운영에 apply 권한이 사라져 파이프라인 형태로 만들기

 

[Cluster 전환 #8] Network Policy 운영에 apply 권한이 사라져 파이프라인 형태로 만들기

Azure DevOps를 사용하여 Network Policy를 파이프라인 형태로 관리하는 방법을 단계별로 설명드리겠습니다. 이 예시에서는 Infra라는 새로운 저장소를 만들고, 네트워크 정책 파일을 관리하며, 파이프

ggumidr.com

 

 

원본 Dockerfile

########## Stage 1: Build projects ##########
# myacr/agent/build/java8-maven:3.8.6 이미지를 기반으로 새로운 빌드 스테이지를 시작합니다.
# 이미지에는 Java 8과 Maven 3.8.6이 설치되어 있습니다.
# AS builder는 이 스테이지의 이름을 builder로 설정하여 이후에 참조할 수 있도록 합니다.
FROM myacr/agent/build/java8-maven:3.8.6 AS builder 

# Set working directory
# 컨테이너 내에서 작업 디렉토리를 /ipapp으로 설정합니다.
WORKDIR /ipapp

# Copy project files
# Build each project
# 각 프로젝트와 라이브러리 파일을 컨테이너의 작업 디렉토리로 복사합니다.
# mvn clean package -Dmaven.test.skip=true 명령을 사용하여 각 프로젝트를 빌드합니다.
# -f 옵션은 특정 POM 파일을 지정합니다.
# clean은 이전 빌드 아티팩트를 제거합니다.
# package는 프로젝트를 패키징합니다 (일반적으로 JAR 또는 WAR 파일로).
# -Dmaven.test.skip=true는 테스트를 건너뜁니다

COPY ./library /ipapp/library 

COPY ./Project_A /ipapp/Project_A
RUN mvn -f /ipapp/Project_A/pom.xml clean package -Dmaven.test.skip=true

COPY ./Project_B /ipapp/Project_B
RUN mvn -f /ipapp/Project_B/pom.xml clean package -Dmaven.test.skip=true

COPY ./Project_C /ipapp/Project_C
RUN mvn -f /ipapp/Project_C/pom.xml clean package -Dmaven.test.skip=true

########## Stage 2: Run Tomcat ##########
# myacr/docker/tomcat:9.0.83-jdk8-corretto-al2-umask 이미지를 기반으로 새로운 실행 스테이지를 시작합니다.
# 이미지에는 Tomcat 9.0.83과 JDK 8이 포함되어 있습니다.
FROM myacr/docker/tomcat:9.0.83-jdk8-corretto-al2-umask

# Copy built WAR files to Tomcat webapps directory
# 빌드 스테이지(builder)에서 생성된 WAR 파일을 Tomcat의 webapps 디렉토리로 복사합니다.
# 각각의 프로젝트에 대해 빌드된 WAR 파일을 복사하여 Tomcat에서 실행될 수 있도록 합니다.
COPY --from=builder /ipapp/Project_A/target/*.war /usr/local/tomcat/webapps/Project_A.war
COPY --from=builder /ipapp/Project_B/target/*.war /usr/local/tomcat/webapps/Project_B.war
COPY --from=builder /ipapp/Project_C/target/*.war /usr/local/tomcat/webapps/Project_C.war

# 3개의 WAR파일이 하나의 톰캣에서 실행 시킬 수 있도록 설정 된 server.xml 을 컨테이너로 복사합니다.
ADD ./conf/server.xml /usr/local/tomcat/conf/

# Start Tomcat
# catalina.sh run 명령을 사용하여 Tomcat 서버를 시작합니다.
# 이 명령은 Tomcat이 포그라운드에서 실행되도록 하여 컨테이너가 계속 실행되도록 합니다.
CMD ["catalina.sh", "run"]



변경 Dockerfile 

# myacr/agent/build/java8-maven:3.8.6 이미지를 기반으로 새로운 빌드 스테이지를 시작합니다.
FROM myacr/agent/build/java8-maven:3.8.6 AS builder 

# Set working directory
WORKDIR /ipapp

# Copy project files
COPY ./library /ipapp/library 

# Exclude 'src/class' directory from being copied to '/ipapp' directory
COPY ./src /ipapp/src

# Build Project A
COPY ./Project_A /ipapp/Project_A
RUN rm -rf /ipapp/Project_A/src/main/webapp/WEB-INF/class  # Remove 'class' directory if it exists
RUN mvn -f /ipapp/Project_A/pom.xml clean package -Dmaven.test.skip=true

# Build Project B
COPY ./Project_B /ipapp/Project_B
RUN rm -rf /ipapp/Project_B/src/main/webapp/WEB-INF/class  # Remove 'class' directory if it exists
RUN mvn -f /ipapp/Project_B/pom.xml clean package -Dmaven.test.skip=true

# Build Project C
COPY ./Project_C /ipapp/Project_C
RUN rm -rf /ipapp/Project_C/src/main/webapp/WEB-INF/class  # Remove 'class' directory if it exists
RUN mvn -f /ipapp/Project_C/pom.xml clean package -Dmaven.test.skip=true

########## Stage 2: Run Tomcat ##########
# myacr/docker/tomcat:9.0.83-jdk8-corretto-al2-umask 이미지를 기반으로 새로운 실행 스테이지를 시작합니다.
FROM myacr/docker/tomcat:9.0.83-jdk8-corretto-al2-umask

# Copy built WAR files to Tomcat webapps directory
COPY --from=builder /ipapp/Project_A/target/*.war /usr/local/tomcat/webapps/Project_A.war
COPY --from=builder /ipapp/Project_B/target/*.war /usr/local/tomcat/webapps/Project_B.war
COPY --from=builder /ipapp/Project_C/target/*.war /usr/local/tomcat/webapps/Project_C.war

# Copy server.xml for configuring Tomcat
ADD ./conf/server.xml /usr/local/tomcat/conf/

# Start Tomcat
CMD ["catalina.sh", "run"]
반응형