🌿

Spring Boot 3.1.0-RC2のDocker Compose対応を試した

2023/05/06に公開

Spring Boot 3.1.0-RC2でDocker Composeへ対応されました。

https://spring.io/blog/2023/05/05/spring-boot-3-1-0-rc2-available-now

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.1.0-RC2-Release-Notes#supported-services

https://docs.spring.io/spring-boot/docs/3.1.0-SNAPSHOT/reference/html//features.html#features.docker-compose.service-connections

どんな感じなのか試してみました。

クラスパスにspring-boot-docker-composeがあるとspring-boot:run実行時に自動でDocker Composeを使用してコンテナを起動してくれるみたいです。
pom.xmlへ次のdependencyを追加しました。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-docker-compose</artifactId>
    <optional>true</optional>
</dependency>

compose.yamlは次の通りです。

services:
  db:
    image: postgres
    ports:
      - 5432
    environment:
      POSTGRES_PASSWORD: pass1234

portsではホスト側のポートを明記しなくても大丈夫です。
また、application.propertiesspring.datasource.*系のプロパティ(urlなど)も書いておかなくても大丈夫です。
次のクラスたちが良い感じにプロパティを組み立ててくれます。

  • org.springframework.boot.docker.compose.service.connection.DockerComposeServiceConnectionsApplicationListener
  • org.springframework.boot.docker.compose.service.connection.postgres.PostgresJdbcDockerComposeConnectionDetailsFactory.PostgresJdbcDockerComposeConnectionDetails
  • org.springframework.boot.docker.compose.service.connection.jdbc.JdbcUrlBuilder

./mvnw spring-boot:runでアプリケーションを起動するとDocker Composeでコンテナが起動されていることがわかります(横に長いためログから日時とログレベルは削除しています)。

[restartedMain] .s.b.d.c.l.DockerComposeLifecycleManager : Found Docker Compose file '/path/to/compose.yaml'
[OutputReader-stderr] o.s.boot.docker.compose.core.DockerCli   : Network app_default  Creating
[OutputReader-stderr] o.s.boot.docker.compose.core.DockerCli   : Network app_default  Created
[OutputReader-stderr] o.s.boot.docker.compose.core.DockerCli   : Container app-db-1  Creating
[OutputReader-stderr] o.s.boot.docker.compose.core.DockerCli   : Container app-db-1  Created
[OutputReader-stderr] o.s.boot.docker.compose.core.DockerCli   : Container app-db-1  Starting
[OutputReader-stderr] o.s.boot.docker.compose.core.DockerCli   : Container app-db-1  Started
[OutputReader-stderr] o.s.boot.docker.compose.core.DockerCli   : Container app-db-1  Waiting
[OutputReader-stderr] o.s.boot.docker.compose.core.DockerCli   : Container app-db-1  Healthy

アプリケーションが起動している状態でdocker compose psを実行するとコンテナが起動していることがわかります。

$ docker compose ps
NAME       COMMAND                  SERVICE             STATUS              PORTS
app-db-1   "docker-entrypoint.s…"   db                  running             0.0.0.0:49170->5432/tcp, :::49170->5432/tcp

control + cでアプリケーションを停止した状態でdocker compose psを実行するとコンテナも停止していることがわかります。

$ docker compose ps
NAME       COMMAND                  SERVICE             STATUS              PORTS
app-db-1   "docker-entrypoint.s…"   db                  exited (0)

JDBC関連プロパティの設定やコンテナの起動・停止などの手間が減って地味にめちゃくちゃ嬉しい気がしました。

以上です。

コード例

https://github.com/backpaper0/spring-boot-docker-compose-example

Discussion