Post

Spring Boot Profile로 Docker에서 애플리케이션 시작

1. 기본 Dockerfile

일반적으로 Spring Boot 애플리케이션을 고정화하기 위해 Dockerfile을 제공하기만 하면 된다.

Spring Boot 애플리케이션을 위한 최소 Dockerfile이다.

1
2
3
FROM openjdk:17-jdk-alpine
COPY target/*.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

물론 docker build를 통해 Docker 이미지를 빌드할 수 있다.

1
docker build --tag=docker-with-spring-profile:latest .

따라서 docker-with-spring-profile 이미지에서 애플리케이션을 실행할 수 있다.

1
docker run docker-with-spring-profile:latest

Spring Boot 애플리케이션은 “default” 프로필로 시작된다.

1
2
3
2024-02-29 22:34:25.268 INFO 1 --- [main] c.b.docker.spring.DemoApplication: Starting DemoApplication using Java 17-ea with PID 1 (/app.jar started by root in /)
2024-02-29 22:34:25.270 INFO 1 --- [main] c.b.docker.spring.DemoApplication: No active profile set, falling back to 1 default profile: "default"
//...

2. Dockerfile에서 Dockerfile 설정

Docker화된 애플리케이션에 대한 프로필을 설정하는 한 가지 방법은 Spring Boot의 명령줄 인수 -Dspring.profiles.active를 사용하는 것이다.

따라서 프로필을 “test”로 설정하려면 Dockerfile의 ENTRYPOINT 줄에 -Dspring.profiles.active=test라는 새 인수를 추가한다.

1
2
//...
ENTRYPOINT ["java", "-Dspring.profiles.active=test", "-jar", "/app.jar"]

프로필 변경 사항을 보려면 동일한 명령을 사용하여 컨테이너를 다시 실행한다.

1
docker run docker-with-spring-profile:latest

따라서 애플리케이션에서 “test” 프로필이 성공적으로 선택되었음을 확인할 수 있다.

1
2
3
2024-02-29 22:39:33.210 INFO 1 --- [main] c.b.docker.spring.DemoApplication: Starting DemoApplication using Java 17-ea with PID 1 (/app.jar started by root in /)
2024-02-29 22:39:33.212 INFO 1 --- [main] c.b.docker.spring.DemoApplication: The following 1 profile is active: "test"
//...

3. 환경 변수를 사용하여 Profile 설정

때로는 Dockerfile에 하드 코딩된 프로필을 사용하는 것이 편리하지 않은 경우도 있다. 둘 이상의 프로필이 필요한 경우 컨테이너를 실행할 때 프로필 중 하나를 선택하는 것이 번거로울 수 있다.

그럼에도 불구하고 더 나은 대안이 있다. 시작하는 동안 Spring Boot는 특수 환경 변수 SPRING_PROFILES_ACTIVE를 찾는다.

따라서 docker run 명령과 함께 이를 실제로 활용하여 시작 시 Spring 프로필을 설정할 수 있다.

1
docker run -e "SPRING_PROFILES_ACTIVE=test" docker-with-spring-profile:latest

또한 사용 사례에 따라 쉼표로 구분된 문자열을 통해 한 번에 두 개 이상의 프로필을 설정할 수 있다.

1
docker run -e "SPRING_PROFILES_ACTIVE=test1,test2,test3" docker-with-spring-profile:latest

그러나 Spring Boot에는 속성 간에 특정 순서가 있다. 명령줄 인수는 환경 변수보다 우선한다. 이러한 이유로 SPRING_PROFILES_ACTIVE를 작동하려면 Dockerfile을 되돌려야 한다.

결과적으로 Dockerfile의 ENTRYPOINT 줄에서 “-Dspring.profiles.active=test” 인수를 제거한다.

1
2
//...
ENTRYPOINT ["java", "-jar", "/app.jar"]

마지막으로 SPRING_PROFILES_ACTIVE를 통해 설정한 프로필이 고려되는 것을 확인할 수 있다.

1
2
3
2024-02-29 22:50:28.924 INFO 1 --- [main] c.b.docker.spring.DemoApplication: Starting DemoApplication using Java 17-ea with PID 1 (/app.jar started by root in /)
2024-02-29T22:50:28.926562249Z 2022-04-22 22:50:28.926 INFO 1 --- [main] c.b.docker.spring.DemoApplication: The following 3 profiles are active: "test1", "test2", "test3"
//..

4. Docker Compose 파일에서 Profile 설정

대체 접근 방식으로 환경 변수를 docker-compose 파일 에 제공할 수도 있습니다 .

또한 docker 실행 작업을 더 나은 방식으로 활용하기 위해 각 프로필에 대해 docker-compose 파일을 만들 수 있다.

“test” profile에 대한 docker-compose-test.yml 파일을 만들어 본다.

1
2
3
4
5
6
version: "3.5"
services:
  docker-with-spring-profile:
    image: docker-with-spring-profile:latest
    environment:
      - "SPRING_PROFILES_ACTIVE=test"

마찬가지로 “prod” profile에 대해 다른 파일 docker-compose-prod.yml을 만든다. 유일한 차이점은 두 번째 파일의 “prod” 프로필이다.

1
2
3
//...
environment:
  - "SPRING_PROFILES_ACTIVE=prod"

따라서 두 가지 다른 docker-compose 파일을 통해 컨테이너를 실행할 수 있다.

1
2
3
4
5
# for the profile 'test'
docker-compose -f docker-compose-test.yml up

# for the profile 'prod'
docker-compose -f docker-compose-prod.yml up

[출처 및 참고]

This post is licensed under CC BY 4.0 by the author.