해결된 질문
작성
·
124
·
수정됨
1
개인적으로 실습을 해보고 있는 과정에서 아무리 해도 해결책을 모르는 것을 물어보고 싶어서 남겨봅니다.
multistagebuild 하기전에 singlestagebuild를 하려고 하는 상황입니다.
# 빌드 환경 설정
FROM gradle:7.6-jdk17
# 작업 디렉토리 설정
WORKDIR /app
# Gradle 빌드 파일과 소스 코드 복사
COPY build.gradle settings.gradle .
COPY src ./src
# Gradle을 사용하여 애플리케이션 빌드
RUN gradle clean build --no-daemon
# 빌드된 JAR 파일을 실행 환경으로 복사
RUN cp build/libs/*.jar app.jar
# 빌드된 JAR 파일 실행
EXPOSE 8080
CMD ["java", "-jar", "app.jar"]
이렇게 입력을 하면 RUN cp 과정에서
"/bin/sh -c cp build/libs/*.jar app.jar" did not complete successfully: exit code: 1"
결과가 나옵니다.
(RUN cp /app/build/libs/*.jar /app/app.jar 로 해도 결과가 똑같이 나옵니다...)
하지만 RUN cp -> COPY로 수정하면 성공합니다.
이유에 대해서 물어봐도 될까요?
아무리 구글링을 해도 답을 찾기가 힘듭니다..
또한 RUN cp로 빌드에 성공하려면 어떻게 작성해야 할까요?
답변 3
1
임중훈님 안녕하세요. 데브위키입니다.
먼저 연휴로 인해 답변히 늦어진 점 사과드립니다.
확인해보니 자바 Gradle이 기본적으로 실행 가능한 Fat JAR (*-SNAPSHOT.jar)과 일반 JAR (*-plain.jar)을 생성하기 때문에 발생하는 것으로 보입니다.
파일이 두개 생성될 때 환경에 따라서 에러가 나는 경우가 있는 것 같습니다.
해결 방법은 파일 명을 직접 입력하거나, 중훈님이 해결하신 것처럼 *-SNAPSHOT.jar로 입력해서 한 개의 파일만 복사되게 하는 것입니다.
또는 gradle 설정으로 한 개의 파일만 생성되도록 강제할 수도 있습니다.
leafy-backend 프로젝트의 build.gralde 파일에 아래의 내용을 추가하신 후 빌드하시면 SNAPSHOT.jar 파일만 생성됩니다.
bootJar {
enabled = true
}
jar {
enabled = false
}
강의 들으시면서 더 궁금하신 부분이 있으면 편하게 질문해주세요!
0
아래 질문은
# 빌드된 JAR 파일을 실행 환경으로 복사 RUN cp /app/build/libs/*-SNAPSHOT.jar ./app.jar
이렇게 해결을 했습니다.
이 방법 밖에 없을까요..?ㅠ
COPY /app/build/*.jar ./app.jar 하면 이것 또한 파일이 두개 일텐데 app.jar로 복사되는 것은 무엇인가요..?
0
궁금한 점...
그래서 RUN cp /app/build/libs/*.jar ./ 로 변경했습니다.
그리고 빌드를 한 후 실행을 시켰을 때 logs 를 입력해서 자동 종료된 이유가 app.jar 파일이 없어서 종료되었다 라는 로그를 보게 됐습니다.
그래서 파일을 복사해서 내부를 봤지만, jar 파일이 SNAPSHOT과 plain 파일 두개가 있어서 CMD에서 app.jar가 없는게 당연하다는 것을 알게됐습니다. 그래서 './app.jar'을 입력했을 시 is not a directory 여서 컨테이너가 종료된것도 해결 됐습니다.
그렇다면 실습에서는 RUN cp 명령 타겟 주소에 plain이 아닌 SNAPSHOT.jar만 app.jar로 복사하는 방법은 있을까요?