SpringBoot With Docker

Intro

간단하게 공부한 도커를 이용해서 스프링부트 서버를 컨테이너화 해보기 위해서

스프링부트 공식 사이트 레퍼런스를 참고하면서 컨테이너화를 진행하면서 궁금한 점을 찾아보면서 정리한다.

 

https://spring.io/guides/topicals/spring-boot-docker

 

Getting Started | Spring Boot with Docker

Congratulations! You have created a Docker container for a Spring Boot application! By default, Spring Boot applications run on port 8080 inside the container, and we mapped that to the same port on the host by using -p on the command line.

spring.io

 

 

위 레퍼런스를 따라하다 보면 Dockerfile에 대해서 궁금한 점이 생겼다.

내가 학습한 Docker는 일단 이미지를 빌드하고 컨테이너화하여 실행하여 브라우저에서 접속할 수 있도록 하는 것을 학습했다.

 

이를 위해 간단한 Dockerfile Command를 살짝 봤었지만, 정확히 어떤 역할을 위한 명령인지 잘 몰라 Docker 레퍼런스를 찾았다.

 

https://docs.docker.com/reference/dockerfile/

 

Dockerfile reference

Find all the available commands you can use in a Dockerfile and learn how to use them, including COPY, ARG, ENTRYPOINT, and more.

docs.docker.com

 

 

이 글에서는 내가 스프링부트를 간단하게 컨테이너화 하면서 궁금한 Command에 대해서 정리한다.

 

Essential

FROM openjdk:8-jdk-alpine
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

 

궁금한 점은 ARG이다.

공식 홈페이지를 참고해보니 ARG는 변수로 값을 저장하는 것인 것 같다.

 

내가 도커 파일 내에서 저장된 변수의 값을 사용할 수 있도록 하고 build할 때 값을 재할당할 수 있고 도커 파일 내에 선언한 값은 아무것도 입력하지 않았을 때의 DEFAULT 값이다.

 

그럼 왜 다음과 같이 ARG를 선언하였는가?

 

이유는 Gradle과 Maven의 빌드 후 jar 파일이 생기는 위치가 다르기 때문에 동적으로 값을 할당하기 위해서이다.

Maven : target/*.jar : 다음 위치에 빌드한 애플리케이션 파일이 생성된다.

Gradle : build/libs/*jar : 다음 위치에 생긴다.

빌드 시 값을 전달을 위한 플래그는 다음과 같다.

--builc-arg JAR_FILE=xxx/xxx...

 

 


 

COPY 레이어도 궁금하다.

공식 홈페이지 명령어 구조

COPY <src> <dest>

 

src는 카피할 원본 파일의 위치를 말하는 것 같은데, dest는 애매했다.

JAR_FILE 변수에 저장된 위치의 파일을 이미지 내부로 복사하면서 app.jar 파일로 저장한다.

 

<src>는 Docker 빌드 컨텍스트에 있는 파일 경로를 가리킨다.
<dest>는 Destination으로 예상과 같이 목적지로 Docker 컨테이너 안에서 파일을 복사할 위치나 이름을 지정한다.

 

이는 컨테이너 루트 디렉터리에 복사된다. 따라서 컨테이너 내부에서 /app.jar 경로에 app.jar가 저장될까?
확인해보자

 

일단 설정한 도커 파일 기반으로 이미지를 빌드한다.

docker build -t springio/gs-spring-boot-docker .
docker run -it springio/gs-spring-boot-docker sh
ls /app

도커 컨테이너를 실행할 때 shell로 못들어가서 도커 데스크톱의 도움을 받아 사진을 첨부한다.

 

 

확인해보니 루트에 app.jar 파일이 잘 생성된 것을 볼 수 있었다.