사전 요구 지식
Docker에 대한 이해 및 실행하는 방법과 Dockerfile 사용법
Spring boot에서 cmd로 값을 입력 받아 사용하는 방법
cmd에서 java jar로 arguments를 전달하는 방법
환경
Spring boot 2.5.7 사용
gitlab-ci로 jar를 docker image로 만들어 빌드합니다.
여기서, 민감정보(datasource.password 등)는 사용자가 직접 입력하는 방식을 채택했으며 아래 사진처럼 username과 password는 사용자가 입력하는 값을 그대로 가져와 사용합니다.
이 때, 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
'Tech > Java&Spring' 카테고리의 다른 글
[SpringBoot] Intellij spring boot 프로젝트 생성 방법 (0) | 2022.01.10 |
---|---|
[Springboot] 민감정보 숨기기 - Argument 입력 (0) | 2021.11.30 |
[Spring] Swagger ui Failed to load API definition 에러 (0) | 2021.09.22 |
[Java] Error와 Exception에 대해 (0) | 2021.02.21 |
[JAVA 기초] 1. JAVA의 특징 (0) | 2021.01.06 |
인프런 지식공유자로 활동하고 있으며 MSA 전환이 취미입니다. 개발과 관련된 다양한 정보를 몰입감있게 전달합니다.