Перейти к основному содержимому

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

· 4 мин. чтения

1. Введение

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

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

2. Базовый файл Docker

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

Давайте посмотрим на минимальный Dockerfile для нашего приложения Spring Boot:

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

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

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

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

docker run docker-with-spring-profile:latest

Как мы заметили, наше приложение Spring Boot запускается с профилем «по умолчанию» :

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"
//...

3. Настройка профиля в 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

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

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"
//...

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

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

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

Таким образом, мы можем практически использовать это с командой запуска docker для установки профилей 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"
//..

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

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

Кроме того, чтобы лучше использовать наши операции запуска docker , мы можем создать файл 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

6. Заключение

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

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