Перейти к содержанию

Запуск приложения Spring Boot в Docker с помощью профиля

Все знают, насколько популярен Docker и как модно для Java-разработчиков контейнеризовать свои приложения Spring Boot. Однако не все разработчики знают, как устанавливать профили в докеризованном приложении Spring Boot.

В этом руководстве объясним, как запустить приложение Spring Boot с профилями, когда оно находится в контейнере Docker.

Базовый Dockerfile

Как правило, для докеризации приложения Spring Boot предоставляем Dockerfile. Посмотрим на минимальный Dockerfile для приложения Spring Boot:

FROM openjdk:11
COPY target/*.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

Конечно, можно собрать образ Docker с помощью docker build:

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

Таким образом, можно запустить приложение из образа docker-with-spring-profile:

docker run docker-with-spring-profile:latest

Приложение Spring Boot запускается с профилем «default»:

2022-04-22 22:34:25.268 INFO 1 --- [main] c.b.docker.spring.DemoApplication: Starting DemoApplication using Java 11.0.14.1 on ea8851bea75f with PID 1 (/app.jar started by root in /)
2022-04-22 22:34:25.270 INFO 1 --- [main] c.b.docker.spring.DemoApplication: No active profile set, falling back to 1 default profile: "default"
//...

Настройка профиля в Dockerfile

Один из способов установить профиль для докеризированного приложения – использовать аргумент командной строки Spring Boot «-Dspring.profiles.active».

Итак, чтобы установить профиль «test», добавляем новый аргумент «-Dspring.profiles.active=test» в строку ENTRYPOINT файла Dockerfile:

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

Чтобы увидеть изменение профиля, снова запустим контейнер с той же командой:

docker run docker-with-spring-profile:latest

Соответственно увидим, что профиль «test» успешно подхватывается приложением:

2022-04-22 22:39:33.210 INFO 1 --- [main] c.b.docker.spring.DemoApplication: Starting DemoApplication using Java 11.0.14.1 on 227974fa84b2 with PID 1 (/app.jar started by root in /)
2022-04-22 22:39:33.212 INFO 1 --- [main] c.b.docker.spring.DemoApplication: The following 1 profile is active: "test"
//...

Настройка профиля с использованием переменных среды

Иногда неудобно использовать жестко запрограммированный профиль в Dockerfile. Если нужно более одного профиля, выбор одного из них может быть громоздким при запуске контейнера.

Однако есть лучшая альтернатива. Во время запуска Spring Boot ищет специальную переменную среды SPRING_PROFILES_ACTIVE.

Таким образом, можно использовать ее с командой docker run для установки профилей Spring при запуске:

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

Кроме того, в зависимости от варианта использования, можно установить более одного профиля одновременно с помощью строк, разделенных запятыми:

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

Однако следует обратить внимание на то, что Spring Boot имеет определенный порядок между свойствами. Аргументы командной строки имеют приоритет над переменными среды. По этой причине, чтобы заставить SPRING_PROFILES_ACTIVE работать, нужно вернуть Dockerfile.

Следовательно, удаляем аргумент «-Dspring.profiles.active=test» из строки ENTRYPOINT Dockerfile:

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

В итоге увидим, что учитываются профили, которые установили через SPRING_PROFILES_ACTIVE:

2022-04-22 22:50:28.924 INFO 1 --- [main] c.b.docker.spring.DemoApplication: Starting DemoApplication using Java 11.0.14.1 on 18eacb6362f8 with PID 1 (/app.jar started by root in /)
2022-04-22T22: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"
//..

Настройка профиля в файле Docker Compose

В качестве альтернативного подхода переменные среды также могут быть предоставлены в файле docker-compose.

Кроме того, чтобы лучше использовать операции docker run, можно создать файл docker-compose для каждого профиля.

Создадим файл docker-compose-test.yml для профиля «test»:

version: "3.5"
services:
  docker-with-spring-profile:
    image: docker-with-spring-profile:latest
    environment:
      - "SPRING_PROFILES_ACTIVE=test"

Аналогично создаем еще один файл docker-compose-prod.yml для профиля «prod» – отличие только в профиле «prod» во втором файле:

//...
environment:
  - "SPRING_PROFILES_ACTIVE=prod"

Поэтому можно запустить контейнер через два разных файла docker-compose:

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

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

Заключение

В этом руководстве описали различные способы установки профилей в докеризованном приложении Spring Boot, а также показали несколько примеров как с Docker, так и с Docker Compose.

Все примеры кода, показанные в этом руководстве, доступны на GitHub.

Оригинал