知識庫 / Spring / Spring Boot RSS 訂閱

使用 Docker 啓動 Spring Boot 應用及配置環境

Docker,Spring Boot
HongKong
5
12:03 PM · Dec 06 ,2025

1. 簡介

我們都知道 Docker 的受歡迎程度以及 Java 開發者將他們的 Spring Boot 應用程序容器化有多流行。然而,在容器化的 Spring Boot 應用程序中設置 profiles 可能會成為一些開發者的問題。

在本教程中,我們將解釋如何在容器內的 Spring Boot 應用程序中使用 profiles 啓動應用程序。

2. 基本 Dockerfile

通常,為了 Dockerize 一個 Spring Boot 應用,我們只需提供一個 Dockerfile

讓我們來看一個用於我們 Spring Boot 應用的最小 Dockerfile

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

當然,我們可以通過 docker build 構建我們的 Docker 鏡像:

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

因此,我們可以從鏡像 docker-with-spring-profile 中運行我們的應用程序:

docker run docker-with-spring-profile:latest

正如我們所觀察到的,我們的 Spring Boot 應用程序以 “default” 模式啓動:

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

3. 在 Dockerfile 中設置 Profile

一種設置我們容器化應用程序 Profile 的方法是使用 Spring Boot 的命令行參數 “-Dspring.profiles.active”

因此,要將 Profile 設置為 “test”,我們向 Dockerfile 的 ENTRYPOINT 行添加一個新的參數:“-Dspring.profiles.active=test”

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

要查看個人資料的更改,讓我們再次運行容器,使用相同的命令:

docker run docker-with-spring-profile:latest

Accordingly, we can see the profile “test” 成功被我們的應用程序識別出來:

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

4. 使用環境變量設置配置文件

有時,在我們的 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

因此,我們從 DockerfileENTRYPOINT 行中移除 “-Dspring.profiles.active=test” 參數:

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

最後,我們可以看到通過 SPRING_PROFILES_ACTIVE 設定的配置方案已經被考慮在內:

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

5. 在 Docker Compose 文件中設置配置文件

作為一種替代方法,配置文件也可以通過環境變量提供,在 docker-compose 文件中。

此外,為了更好地利用我們的 docker run 操作,我們可以為每個配置文件創建 docker-compose 文件。

讓我們為 “test” 配置文件創建一個 docker-compose-test.yml 文件:

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 應用程序中設置不同 profile 的各種方法,並展示了使用 Docker 和 Docker Compose 的一些示例。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.