🌿
Spring Boot 3.1.0-RC2のDocker Compose対応を試した
Spring Boot 3.1.0-RC2でDocker Composeへ対応されました。
どんな感じなのか試してみました。
クラスパスに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.propertiesへspring.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関連プロパティの設定やコンテナの起動・停止などの手間が減って地味にめちゃくちゃ嬉しい気がしました。
以上です。
コード例



Discussion