반응형

데이터베이스 비밀번호나 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              ...

문제없이 실행 중입니다.

이렇게 외부에 비밀 설정파일들을 관리하며 배포를 진행할 수 있습니다.

반응형

+ Recent posts