반응형
SMALL
Dockerfile을 사용하여 Maven 빌드 시에 소스 코드 수정이 제대로 반영되지 않는 문제는 일반적으로 Docker의 캐시 메커니즘 때문에 발생할 수 있습니다.
Docker는 이미지 빌드 과정에서 캐시를 사용하여 중복된 단계를 최소화하려고 합니다.
이로 인해 Docker는 빌드 컨텍스트 내에서 변경된 파일만을 인식하지 못할 수 있습니다.
만약 소스 코드 (src 디렉토리) 안에 class 디렉토리가 이미 포함되어 있고,
이를 Docker 빌드 시에 Maven 빌드에서 제외하고자 한다면,
Dockerfile에서 Maven 빌드 단계에서 이 디렉토리를 제외시키는 방법을 사용할 수 있습니다.
보통 Maven은 소스 코드를 컴파일하고 빌드할 때 target 디렉토리에 클래스 파일을 생성하지만,
때때로 소스 코드 자체에 클래스 파일이 이미 포함되어 있을 수 있습니다.
아래 예시를 통해 Dockerfile에서 클래스 파일이 이미 포함된 src/class 디렉토리를 제외하는 방법을 공유하겠습니다.
2024.07.26 - [#IT 업무노트] - [Cluster 전환 #9] 프록시 서버 구성하기
2024.06.29 - [#IT 업무노트] - [Cluster 전환 #8] Network Policy 운영에 apply 권한이 사라져 파이프라인 형태로 만들기
원본 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"]
반응형
'#IT 업무노트' 카테고리의 다른 글
[특허 용어] 출원인, 선행기술조사 (0) | 2024.07.31 |
---|---|
[Cluster 전환 #11] THE JSP specification requires that and attribute name is preceded by whitespace (1) | 2024.07.26 |
[Cluster 전환 #9] 프록시 서버 구성하기 (0) | 2024.07.26 |
[Cluster 전환 #8] Network Policy 운영에 apply 권한이 사라져 파이프라인 형태로 만들기 (1) | 2024.06.30 |
[통합EAI Pilot] 통합EAI Pilot 시스템 적용 (0) | 2024.06.29 |