Spring 환경에서 Docker run으로 jar에 argument 전달하기
Tech/Spring

Spring 환경에서 Docker run으로 jar에 argument 전달하기

반응형


사전 요구 지식

Docker에 대한 이해 및 실행하는 방법과 Dockerfile 사용법

Spring boot에서 cmd로 값을 입력 받아 사용하는 방법

cmd에서 java jar로 arguments를 전달하는 방법

 

환경

Spring boot 2.5.7 사용

gitlab-ci로 jar를 docker image로 만들어 빌드합니다.

여기서, 민감정보(datasource.password 등)는 사용자가 직접 입력하는 방식을 채택했으며 아래 사진처럼 username과 password는 사용자가 입력하는 값을 그대로 가져와 사용합니다.

 

application.yml

 

이 때, docker run으로 해당 argument에 값을 전달하려면 어떻게 해야하는지 이 포스트에서 설명합니다.

하지만 해당 포스트에서 spring boot 내에서 argument를 처리하는 방법은 다루지 않습니다.

 

목표

docker run 환경에서 빌드된 jar에 값을 전달할 수 있습니다.

 

 

쉽게 말해, 최종 도착지는 Spring boot 내의 username과 password 변수이며, 이 값을 사용자가 직접 전달하는 방식입니다.

그 사이에 Docker로 값을 전달하고 Docker는 Dockerfile을 통해 jar로 값을 전달하고 jar는 Spring boot로 값을 전달하는 과정을 거치게 됩니다.


방법

1. Dockerfile의 ENTRYPOINT 설정

spring boot에 값을 전달하기 위한 옵션이 따로 존재합니다.

ENTRYPOINT ["java", "-jar", "/app.jar", "-Dspring-boot.run.arguments=--datasource.username=${DATASOURCE_USERNAME}, --datasource.password=${DATASOURCE_PASSWORD}"]

반드시 -Dspring-boot.run.arguments를 사용해야만 argument를 전달할 수 있습니다.

--datasource.username은 application.yml에 세팅되어 있는 값입니다. 사전에 설정되어 있지 않으면 값을 전달할 수 없습니다.

 

2. Docker run에서 Arugment 전달

Docker가 build 되었다고 가정하고 run하는 환경에서 Argument를 전달하겠습니다.

 

username: kangsh
password: kangsh12

라는 argument를 전달하겠습니다.

 

Swagger 접속 확인을 위해 포트는 8080으로 고정해줍니다. 또한 요구하는 argument를 함께 전달하는 커맨드입니다.

 

docker run -p 8080:8080 [도커이미지명] --DATASOURCE_USERNAME=kangsh --DATASOURCE_PASSWORD=kangsh12

 


마무리

Docker run을 할 때 환경변수로 -e 옵션이 존재하긴 합니다.

Dockerfile에서도 ARG, ENV 등 여러 명령어를 사용했으나 도통 argument가 전달이 되지 않아 이틀에 걸쳐 서칭한 끝에 해결할 수 있었습니다.

 

비슷한 환경에 처한 분들께 도움이 되었으면 좋겠습니다.


Reference

Pass command line args to Java app (Spring Boot) running in Docker

반응형