인프런 커뮤니티 질문&답변

cho766님의 프로필 이미지
cho766

작성한 질문수

개발자를 위한 쉬운 도커

멀티 스테이지 빌드(Multi-Stage Build)

멀티 스테이지 빌드 COPY 명령어 질문

해결된 질문

작성

·

298

1

멀티 스테이지 빌드 강의에서 사용된 Dockerfile.multistage에 관한 질문입니다!

두 번째 스테이지(openjdk:11-jre-slim)에서 사용된

COPY --from=build /app/target/*.jar ./app.jar

에서 해당 명령어를

COPY --from=build /app/target/*.jar ./

라고 작성하면 안되는건가요? COPY 명령어는 로컬 컴퓨터에 있는 파일을 도커 컨테이너 내부 파일 시스템에 복사하는 명령어로 알고 있고, 명령어에 입력되는 값은 복사에 필요한 디렉토리를 설정하는 것으로 알고 있습니다.

 

1) 도커 컨테이너의 루트 디렉토리에 app.jar 파일을 복사하는 용도라면 위와 같이 작성해도 되는게 아닌지 궁금합니다!

2) 또한 COPY 명령어의 처음 값으로 나오는 /app/target/*.jar에서 *.jar가 .jar로 끝나는 모든 파일을 지칭하는 것인지 궁금합니다! Maven으로 빌드시 생성되는 결과물이 여러개여서 그런건가요?

답변 2

1

데브위키님의 프로필 이미지
데브위키
지식공유자

cho766님 안녕하세요. 데브위키입니다.

AI인턴의 답변과 마찬가지로 1)에서 질문주신 방식으로 하게 되면 파일 명이 그대로 복사되기 때문에 CMD 지시어에 넣은 java -jar app.jar에서 에러가 발생할 수 있습니다! 그래서 파일 명을 지정했습니다

 

2)에서 질문주신 내용:

빌드 시 생성되는 jar파일의 이름이 바뀌어도 문제없이 실행되도록 편의상 *.jar로 지정해 두었는데, 사실 이 방법이 최선은 아닙니다. 왜냐 하면 말씀해주신 것처럼 Maven 빌드로 생성되는 결과물이 여러 개일 경우 복사 시 에러가 발생할 수 있기 때문입니다.

 

질문에 답변이 되셨는지요?

강의 들으시면서 더 궁금하신 내용이 있으시면 편하게 문의 부탁드립니다

1

안녕하세요, 인프런 AI 인턴입니다.

  1. 도커 멀티 스테이지 빌드에서 COPY --from=build /app/target/*.jar ./app.jar 명령어는 build 단계에서 생성된 jar 파일을 app.jar라는 이름으로 작업 디렉토리(경로 ./)에 복사합니다. 반면 COPY --from=build /app/target/*.jar ./ 명령어는 해당 jar 파일을 작업 디렉토리에 원본 파일명 그대로 복사합니다. 따라서 jar 파일을 특정 이름으로 지정하여 복사할 필요가 없다면 후자의 명령어도 사용할 수 있습니다.

  2. /app/target/*.jar에서 *.jar는 모든 .jar 확장자를 가진 파일을 지칭합니다. Maven이나 Gradle 같은 빌드 도구를 사용할 때 여러 가지 jar 파일을 생성할 수 있습니다. 예를 들어 소스 코드에 포함된 클래스들을 담은 jar 파일 이외에도 소스와 문서 등을 포함하는 별도의 jar 파일들이 만들어질 수 있죠. 이는 필요에 따라 빌드 결과물을 다양하게 활용하기 위함입니다.

Spring Boot Reference Documentation에서 언급된 멀티 스테이지 Dockerfile 예시를 참고하시면 COPY 명령어 사용에 대해 더 나은 이해를 얻을 수 있습니다. 위 예시에서는 COPY --from=builder application/dependencies/ ./ 명령어를 통해 각 레이어를 적절히 분리하여 최적화된 이미지를 생성하는 방법이 설명되어 있습니다.

cho766님의 프로필 이미지
cho766

작성한 질문수

질문하기