SpringBoot3 整合Docker-Compose的实现步骤

 更新时间:2025年08月07日 10:25:46   作者:秋锦  
本文主要介绍了SpringBoot3 整合Docker-Compose的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

它有什么优势

同样的约定大于配置,使用docker-compose时写的配置可以被SpringBoot3自动发现,在使用它时我们可以减少更多的书写配置,一切由它自动完成,比如常见的mysql,redis等都可以省略配置了,后面有具体的例子

添加依赖

 <!--  springboot3 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

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

 <!--  mysql-->
         <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>

 <!--  redis-->
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

compose推荐配置

注意skip 需要在start_only下才能正常执行,不然在start_and_stop模式下应用启动->启动容器->关闭容器->关机 ,skip等于无效参数

spring:
  docker:
    compose:
      profiles:
        active: dev # 指定当前运行环境
      enabled: true # 开启compose
      start:
        skip: if_running  # 如果容器在运行就不再去再启动了
      lifecycle-management: start_only # 这个参数不会在停机后关闭容器
services:
  mysql:
    image: 'mysql:latest'
    restart: always
    environment:
      - MYSQL_DATABASE=root
      - MYSQL_ROOT_PASSWORD=123456
    ports:
      - '3306:3306'
    profiles:
      - dev
    labels:
      # 特殊参数特殊处理
      org.springframework.boot.jdbc.parameters: useUnicode=true&allowPublicKeyRetrieval=true&characterEncoding=utf-8&useSSL=false
  redis:
    image: 'redis:latest'
    restart: always
    environment:
      - 'REDIS_PASSWORD=redis'
    ports:
      - '6379:6379'
    profiles:
      - dev

docker-compose生命管理器

org.springframework.boot.docker.compose.lifecycle.DockerComposeLifecycleManager 负责整合后的compose生命管理,包括容器创建,启动,停止,以及最后的配置自动发现,其中我们需要的配置也在读取docker-compose.yml后存了下来,

然后在容器启动完成后随之发布事件DockerComposeServicesReadyEvent,在被DockerComposeServiceConnectionsApplicationListener监听到后开始注册配置

    private void registerConnectionDetails(BeanDefinitionRegistry registry, List<RunningService> runningServices) {
         //  runningServices是前面docker-compose中写的service
        for (RunningService runningService : runningServices) {
            DockerComposeConnectionSource source = new DockerComposeConnectionSource(runningService);
            // getConnectionDetails获取`spring.factories`里面注册的`ConnectionDetailsFactory`具体实现
            this.factories.getConnectionDetails(source, false).forEach((connectionDetailsType, connectionDetails) -> {
                register(registry, runningService, connectionDetailsType, connectionDetails);
                this.factories.getConnectionDetails(connectionDetails, false)
                    .forEach((adaptedType, adaptedDetails) -> register(registry, runningService, adaptedType,
                            adaptedDetails));
            });
        }
    };
        }
    }

最后跟以前的配置自动发现一样由org.springframework.boot.autoconfigure.service.connection.ConnectionDetails

这个接口负责,比如其中关于mysqldocker-compose整合的实现类为org.springframework.boot.docker.compose.service.connection.mysql.MySqlJdbcDockerComposeConnectionDetailsFactory

注意事项

  • skip 需要搭配 lifecycle-management使用

  • 常规的environment 参数由SpringBoot自动发现,一些特殊参数,比如mysql连接参数可以放到labels下面,格式类似于org.springframework.boot.jdbc.parameters,具体的话可以翻看源码,一般会直接定义在ConnectionDetails实现类里面

到此这篇关于SpringBoot3 整合Docker-Compose的实现步骤的文章就介绍到这了,更多相关SpringBoot3 整合Docker-Compose内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Java Scanner如何获取字符串和带空格的字符串

    Java Scanner如何获取字符串和带空格的字符串

    这篇文章主要介绍了Java Scanner如何获取字符串和带空格的字符串问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Spring Boot 内置工具类ReflectionUtils的实现

    Spring Boot 内置工具类ReflectionUtils的实现

    ReflectionUtils是一个反射工具类,它封装了Java反射的操作,使得我们能够更轻松地操作和访问类的方法、字段,本文主要介绍了Spring Boot 内置工具类ReflectionUtils的实现,感兴趣的可以了解一下
    2023-11-11
  • 通过实例解析java String不可变性

    通过实例解析java String不可变性

    这篇文章主要介绍了通过实例解析java String不可变性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • java-jwt 使用小结

    java-jwt 使用小结

    java-jwt是用于在Java应用程序中创建和验证JSON Web Tokens的库,它由Auth0提供,功能强大且易于使用,适合处理基于 JWT 的身份验证和授权,下面就来介绍一下如何使用,感兴趣的可以了解一下
    2026-01-01
  • java批量下载将多个文件(minio中存储)压缩成一个zip包代码示例

    java批量下载将多个文件(minio中存储)压缩成一个zip包代码示例

    在Java应用程序中有时我们需要从多个URL地址下载文件,并将这些文件打包成一个Zip文件进行批量处理或传输,这篇文章主要给大家介绍了关于java批量下载将多个文件(minio中存储)压缩成一个zip包的相关资料,需要的朋友可以参考下
    2023-11-11
  • SpringBoot之使用Redis实现分布式锁(秒杀系统)

    SpringBoot之使用Redis实现分布式锁(秒杀系统)

    这篇文章主要介绍了SpringBoot之使用Redis实现分布式锁(秒杀系统),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 使用Java将字节数组转成16进制形式的代码实现

    使用Java将字节数组转成16进制形式的代码实现

    在很多场景下,需要进行分析字节数据,但是我们存起来的字节数据一般都是二进制的,这时候就需要我们将其转成16进制的方式方便分析,本文主要介绍如何使用Java将字节数组格式化成16进制的格式并输出,需要的朋友可以参考下
    2024-05-05
  • SpringBoot详细讲解日志文件

    SpringBoot详细讲解日志文件

    Spring Boot默认使用SLF4J+Logback 记录日志,并提供了默认配置,即使我们不进行任何额外配,也可以使用SLF4J+Logback进行日志输出
    2022-06-06
  • MyBatis-Plus混合使用XML和注解过程

    MyBatis-Plus混合使用XML和注解过程

    文章介绍了MyBatis-Plus混合使用XML和注解配置的方法和最佳实践,包括配置原则、具体配置方法、注意事项、动态SQL示例、常见问题及解决方案,同时,还详细说明了@MapperScan与mapper-locations的区别和使用场景
    2025-12-12
  • Java实现Word/Excel/TXT转PDF的方法

    Java实现Word/Excel/TXT转PDF的方法

    这篇文章主要介绍了Java实现Word/Excel/TXT转PDF的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01

最新评论