스프링부트 빌드 도커 파일 문제 해결 과정
현재 3월부터 진행하고 있는 스프링부트 프로젝트 (Fashion Cloud)을 하고 있는 과정에서
처음 프로젝트 생성할때 도커파일을 만들어두고 연결을 했다고 생각하였는데 빌드가 정상적으로 발생하지 않는 문제가 발생하였다.
웃긴 게 터미널에 빌드가 되는 형태로 나와있었으면서 막상 서버는 빌드가 최신으로 업데이트 되지 않은 것으로 띄워졌다…
처음 도커 파일 생성
FROM openjdk:11 AS builder
VOLUME /tmp
COPY ./gradlew .
# gradlew 복사
COPY ./gradle gradle
# gradle 복사
COPY ./build.gradle .
# build.gradle 복사
COPY ./settings.gradle .
# settings.gradle 복사
COPY ./src src
# 웹 어플리케이션 소스 복사
RUN chmod +x ./gradlew
# gradlew 실행권한 부여
RUN ./gradlew bootJar
# gradlew를 사용하여 실행 가능한 jar 파일 생성
FROM openjdk:11
COPY --from=builder build/libs/*.jar app.jar
# builder 이미지에서 build/libs/*.jar 파일을 app.jar로 복사
EXPOSE 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
기본적으로 스프링부트의 도커파일을 참고해서 작성하였는데 초기 문제는 우리가 스프링부트를 jdk17버전을 사용하고 있었다.
그러면 17버전으로 바꾸기만 하면 될까라는 생각으로 버전만 바꿨지만 역시나 문제가 발생하였다.
#0 0.251 xargs is not available
아무래도 xargs가 정상적으로 동작하지 않는 것 같다. 그래서 나는 구글링을 통해 해당 코드로 수정하였다.
도커 파일 17버전으로 수정하는 과정
# gradlew 실행권한 부여
RUN ./gradlew dependencies --no-daemon
RUN ./gradlew build --no-daemon
FROM openjdk:17-jdk
ARG JAR_FILE=build/libs/*.jar
VOLUME /tmp
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
entrypoint에서 설계하는 과정에서 문제가 생긴 것 같아 이렇게 수정하였고 실행을 했을때 정상적으로 실행이 되었다.(?)
근데 이 과정이 훼이크였다.. 코드상으로는 gradlew 파일을 다 복사하고
gradlew build을 해준 다음 이 파일을 실행하도록 만들었는데
빌드가 안됐으면 빌드 오류가 떠야되는데 이상하게 빌드를 하고 copy까지 된다음
실행이 됐는데도 최신 빌드버전으로 실행이 되지 않았다.
여기서 쎄했던 게 로컬에서 gradlew build을 해서 파일을 생성해놓지 않았으면 오류가 생기긴 했었다..
이 문제가 이후 도커에서 스프링부트 서버와 레디스 캐시를 연결하는 과정에 큰 걸림돌이 되었다.
스프링부트 jdk17버전 해결
# gradlew 실행권한 부여
RUN microdnf install findutils
이 명령어를 통해 xargs을 설치하고 동작하도록 만들었고,
이 코드를 넣었더니 빌드를 제대로 해주고 동작하더라… 문제해결!
최종 코드
FROM openjdk:17 AS builder
VOLUME /tmp
COPY ./gradlew .
# gradlew 복사
COPY ./gradle gradle
# gradle 복사
COPY ./build.gradle .
# build.gradle 복사
COPY ./settings.gradle .
# settings.gradle 복사
COPY ./src src
# 웹 어플리케이션 소스 복사
RUN chmod +x ./gradlew
# gradlew 실행권한 부여
RUN microdnf install findutils
RUN ./gradlew bootJar
# gradlew를 사용하여 실행 가능한 jar 파일 생성
FROM openjdk:17
COPY --from=builder build/libs/*.jar app.jar
# builder 이미지에서 build/libs/*.jar 파일을 app.jar로 복사
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
Comments