데이터베이스 비밀번호나 key값 등의 민감한 데이터는 별도의 설정파일로 분할해서 관리해야 합니다.
이러한 파일은 깃허브와 같은 공개된 저장소에 올라가면 안되므로 프로젝트 바깥에 따로 보관하게 됩니다.
# secret/application-secret.yml
spring:
datasource:
url: ...
username: myusername
password: mypassword
driver-class-name: ...
프로젝트 외부의 secret이라는 디렉토리 내에 다음과 같이 비밀번호가 기록된 yml 파일을 저장해두었습니다.
프로젝트 내부에는 다음과 같은 설정 파일이 있습니다.
application.yml
application-secret.yml
application-local.yml
application-prod.yml
application.yml은 다음과 같습니다.
# application.yml
spring:
profiles:
active: local
include:
- secret
로컬 환경에서는 application-local.yml, 배포 환경에서는 application-prod.yml을 사용할 것입니다.
프로젝트 내부에 있는 application-secret.yml은 .gitignore에 등록되어있습니다.
현재 로컬 환경이므로 프로젝트 내부에 있는 application-secret.yml을 그대로 사용할 것입니다.
배포를 하기 위해 먼저 빌드를 진행해줍니다.
./gradlew bootJar
build/libs에 jar파일이 생성되었습니다.
배포를 하기 위해 도커파일을 작성해줍니다.
FROM openjdk:11-jdk
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} myapp.jar
ENTRYPOINT ["java", "-Dspring.profiles.active=prod", "-Dspring.config.location=classpath:/application.yml,/secret/application-secret.yml", "-jar", "/myapp.jar"]
작성한 도커파일은 위와 같습니다.
jar파일을 실행할 때, -Dspring.profiles.active 옵션으로 profile을 prod로 바꿔주고,
-Dspring.config.location으로 설정파일의 위치를 지정해줍니다.
각 설정파일은 ","로 구분됩니다.
기본 설정 값을 바꾸는 것이므로 application.yml도 다시 설정해주고,
해당 컨테이너 내의 /secret 디렉토리 내에 application-secret.yml도 설정파일로 등록해줍니다.
컨테이너 내에 설정 파일을 넣는 작업은 볼륨을 이용할 것입니다.
application.yml 은 jar파일 내의 루트 경로에 있으므로 앞에 "classpath:"를 붙여준 것입니다.
볼륨을 지정하기 위해서 docker-compose.yml을 작성해줍니다.
version: "3"
services:
myapp:
build: .
volumes:
- ../secret:/secret
ports:
- 8080:8080
volumes 옵션으로 기존의 호스트 OS에 설정파일이 저장된 경로를 컨테이너 내에 /secret경로와 매핑시켜주었습니다.
호스트OS경로:컨테이너경로
위처럼 사용하면, 호스트 OS와 컨테이너에 있는 해당 경로의 디렉토리가 마운트됩니다.
그러면 서로 파일을 공유할 수 있습니다.
docker-compose up --build -d
docker-compose 명령어로 빌드하여 컨테이너를 구동해줍니다.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
93102c198b08 ... "java -Dspring.profi…" 16 minutes ago Up 16 minutes 0.0.0.0:8080->8080/tcp ...
문제없이 실행 중입니다.
이렇게 외부에 비밀 설정파일들을 관리하며 배포를 진행할 수 있습니다.
'Spring' 카테고리의 다른 글
Spring 트랜잭션에서 런타임예외 발생해도 커밋하는 법 (0) | 2021.11.10 |
---|---|
spring boot, docker, docker-compose, nginx 이용해서 무중단 배포하기 (0) | 2021.11.10 |
스프링 스케줄링하기 (0) | 2021.11.10 |
Spring에서 gson을 이용하여 중첩 구조 json 스트링을 객체로 변환 (0) | 2021.11.10 |
An invalid character [32] was present in the Cookie value (0) | 2021.11.09 |