1. 序章

Dockerがどれほど人気があり、Java開発者にとってSpringBootアプリケーションをコンテナ化することがどれほどファッショナブルであるかは誰もが知っています。 ただし、ドッキングされたSpring Bootアプリケーションでプロファイルを設定する方法は、一部の開発者にとっては疑問になる可能性があります。

このチュートリアルでは、Dockerコンテナ内にあるプロファイルを使用してSpring Bootアプリケーションを起動する方法について説明します。

2. 基本Dockerfile

通常、 Spring Bootアプリケーションをドッキングするには、Dockerfileを提供するだけです。

Spring Bootアプリケーションの最小限のDockerfileを見てみましょう。

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

確かに、 dockerbuildを介してDockerイメージをビルドできます。

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

したがって、イメージdocker-with-spring-profileからアプリケーションを実行できます。

docker run docker-with-spring-profile:latest

お気づきのとおり、SpringBootアプリケーションは「デフォルト」プロファイルで始まります。

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でのプロファイルの設定

ドッキングされたアプリケーションのプロファイルを設定する1つの方法は、Spring Bootのコマンドライン引数「-Dspring.profiles.active」を使用することです。

したがって、プロファイルを“ test” として設定するには、DockerfileのENTRYPOINTに新しい引数“-Dspring.profiles.active = test”、を追加します。ライン:

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

4. 環境変数を使用したプロファイルの設定

Dockerfileでハードコードされたプロファイルを使用すると便利でない場合があります。 複数のプロファイルが必要な場合、コンテナを実行するときにそれらの1つを選択するのは面倒な場合があります。

それにもかかわらず、より良い代替手段があります。 起動時に、SpringBootは特別な環境変数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

ただし、SpringBootにはプロパティ間に特定の順序があることに注意する必要があります。 コマンドライン引数は環境変数よりも優先されます。このため、 SPRING_PROFILES_ACTIVE を機能させるには、Dockerfileを元に戻す必要があります。

したがって、DockerfileのENTRYPOINT行から“-Dspring.profiles.active = test”引数を削除します。

//...
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. DockerComposeファイルでのプロファイルの設定

別のアプローチとして、環境変数を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"

同様に、「prod」プロファイル用に別のファイル docker-compose-prod.yml を作成します。唯一の違いは、「prod」のプロファイルです。 2番目のファイル:

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

したがって、2つの異なる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. 結論

このチュートリアルでは、Docker化されたSpring Bootアプリケーションでプロファイルを設定するさまざまな方法について説明し、DockerとDockerComposeの両方を使用したいくつかの例も示しました。

いつものように、このチュートリアルに示されているすべてのコードサンプルは、GitHubから入手できます。