Docker Compose Support

Docker Compose 是一项流行的技术,可用于定义和管理应用程序所需服务的多个容器。通常在您的应用程序旁边创建一个 `@`3 文件,用于定义和配置服务容器。 使用 Docker Compose 的典型工作流是运行 `@`4,使用它连接到已启动的服务,在完成后运行 `@`5。 `@`6 模块可以包含在项目中,以提供使用 Docker Compose 处理容器的支持。将模块依赖项添加到您的构建中,如以下针对 Maven 和 Gradle 的清单中所示:

Maven
<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-docker-compose</artifactId>
		<optional>true</optional>
	</dependency>
</dependencies>
Gradle
dependencies {
	developmentOnly("org.springframework.boot:spring-boot-docker-compose")
}

当这个模块作为依赖项包含时,Spring Boot 将执行以下操作:

  • 在您的应用程序目录中搜索 `@`7 和其他常见的 Compose 文件名

  • 使用发现的 `@`9 调用 `@`8

  • 为每个受支持的容器创建服务连接 bean

  • 在应用程序关闭时调用 `@`10

如果在启动应用程序时 Docker Compose 服务已经运行,Spring Boot 将只为每个受支持的容器创建服务连接 bean。它不会再次调用 `@`11,也不会在应用程序关闭时调用 `@`12。

默认情况下,在运行测试时 Spring Boot 的 Docker Compose 支持被禁用。要启用它,请将 configprop:spring.docker.compose.skip.in-tests[] 设置为 `@`13。

Prerequisites

您需要在路径上拥有 @`14 和 `@`15 (或 `@`16) CLI 应用程序。支持的最小 Docker Compose 版本为 2.2.0。

Service Connections

服务连接是到任何远程服务的连接。Spring Boot 的自动配置可以获取服务连接的详细信息,并使用它们来建立与远程服务的连接。执行此操作时,连接详细信息优先于任何与连接相关的配置属性。

使用 Spring Boot 的 Docker Compose 支持时,服务连接建立到容器映射的端口。

Docker Compose 通常以使容器内的端口映射到您计算机上的临时端口的方式使用。例如,Postgres 服务可以在容器内使用端口 5432 运行,但被映射到本地完全不同的端口。服务连接将始终发现并使用本地映射的端口。

通过使用容器的镜像名称来建立服务连接。当前支持以下服务连接:

Connection Details Matched on

ActiveMQConnectionDetails

名称为“symptoma/activemq”或“apache/activemq-classic”的容器

ArtemisConnectionDetails

Containers named "apache/activemq-artemis"

CassandraConnectionDetails

名称为“cassandra”或“bitnami/cassandra”的容器

ElasticsearchConnectionDetails

名称为“elasticsearch”或“bitnami/elasticsearch”的容器

JdbcConnectionDetails

名为“gvenzl/oracle-free”、“gvenzl/oracle-xe”、“mariadb”、“bitnami/mariadb”、“mssql/server”、“mysql”、“bitnami/mysql”、“postgres”或“bitnami/postgresql”的容器

LdapConnectionDetails

Containers named "osixia/openldap"

MongoConnectionDetails

名为“mongo”或“bitnami/mongodb”的容器

Neo4jConnectionDetails

名为“neo4j”或“bitnami/neo4j”的容器

OtlpMetricsConnectionDetails

Containers named "otel/opentelemetry-collector-contrib"

OtlpTracingConnectionDetails

Containers named "otel/opentelemetry-collector-contrib"

PulsarConnectionDetails

Containers named "apachepulsar/pulsar"

R2dbcConnectionDetails

名为“gvenzl/oracle-free”、“gvenzl/oracle-xe”、“mariadb”、“bitnami/mariadb”、“mssql/server”、“mysql”、“bitnami/mysql”、“postgres”或“bitnami/postgresql”的容器

RabbitConnectionDetails

名为“rabbitmq”或“bitnami/rabbitmq”的容器

RedisConnectionDetails

名为“redis”或“bitnami/redis”的容器

ZipkinConnectionDetails

Containers named "openzipkin/zipkin".

Custom Images

有时你可能需要使用自己版本的映像来提供服务。只要行为与标准映像一致,你就可以使用任何自定义映像。具体而言,标准映像支持的任何环境变量也必须在你的自定义映像中使用。

如果你的映像使用不同的名称,则可以在你的 compose.yml 文件中使用标签,以便 Spring Boot 可以提供服务连接。使用名为 org.springframework.boot.service-connection 的标签来提供服务名称。

例如:

services:
  redis:
    image: 'mycompany/mycustomredis:7.0'
    ports:
      - '6379'
    labels:
      org.springframework.boot.service-connection: redis

Skipping Specific Containers

如果你在 compose.yml 中定义了不想连接到你的应用程序的容器映像,则可以使用标签来忽略它。带有标签 org.springframework.boot.ignore 的任何容器都将被 Spring Boot 忽略。

例如:

services:
  redis:
    image: 'redis:7.0'
    ports:
      - '6379'
    labels:
      org.springframework.boot.ignore: true

Using a Specific Compose File

如果你的 Compose 文件与你的应用程序不在同一个目录中,或名称不同,则可以在 application.propertiesapplication.yaml 中使用 configprop:spring.docker.compose.file[] 指向不同的文件。属性可以定义为确切路径或相对于你的应用程序的路径。

例如:

spring:
  docker:
    compose:
      file: "../my-compose.yml"

Waiting for Container Readiness

由 Docker Compose 启动的容器可能需要一些时间才能完全就绪。检查就绪性的推荐方法是在你的 compose.yml 文件中的服务定义下添加一个 healthcheck 部分。

因为 healthcheck 配置通常从 compose.yml 文件中省略,Spring Boot 也会直接检查服务就绪性。默认情况下,当可以建立到容器映射端口的 TCP/IP 连接时,容器被视为就绪。

你可以在 compose.yml 文件中添加 org.springframework.boot.readiness-check.tcp.disable 标签,为每个容器禁用此功能。

例如:

services:
  redis:
    image: 'redis:7.0'
    ports:
      - '6379'
    labels:
      org.springframework.boot.readiness-check.tcp.disable: true

你也可以在 application.propertiesapplication.yaml 文件中更改超时值:

spring:
  docker:
    compose:
      readiness:
        tcp:
          connect-timeout: 10s
          read-timeout: 5s

可以使用 configprop:spring.docker.compose.readiness.timeout[] 配置总体超时。

Controlling the Docker Compose Lifecycle

默认情况下,Spring Boot 在你的应用程序启动时调用 docker compose up,在应用程序关闭时调用 docker compose stop。如果你希望有不同的生命周期管理,可以使用 configprop:spring.docker.compose.lifecycle-management[] 属性。

支持以下值:

  • none - 不启动或停止 Docker Compose

  • start-only - 在应用程序启动时启动 Docker Compose,并使其运行

  • start-and-stop - 在应用程序启动时启动 Docker Compose,并在 JVM 退出时停止 Docker Compose

此外,你可以使用 configprop:spring.docker.compose.start.command[] 属性来更改使用 docker compose up 还是 docker compose start。configprop:spring.docker.compose.stop.command[] 允许你配置使用 docker compose down 还是 docker compose stop

以下示例显示如何配置生命周期管理:

spring:
  docker:
    compose:
      lifecycle-management: start-and-stop
      start:
        command: start
      stop:
        command: down
        timeout: 1m

Activating Docker Compose Profiles

Docker Compose 配置与 Spring 配置类似,它们都允许你调整特定环境的 Docker Compose 配置。如果你想激活某个特定的 Docker Compose 配置,可以在 application.propertiesapplication.yaml 文件中使用 configprop:spring.docker.compose.profiles.active[] 属性:

spring:
  docker:
    compose:
      profiles:
        active: "myprofile"