当前位置: 代码网 > it编程>编程语言>Java > SpringBoot3 整合Docker-Compose的实现步骤

SpringBoot3 整合Docker-Compose的实现步骤

2025年08月07日 Java 我要评论
它有什么优势同样的约定大于配置,使用docker-compose时写的配置可以被springboot3自动发现,在使用它时我们可以减少更多的书写配置,一切由它自动完成,比如常见的mysql,redis

它有什么优势

同样的约定大于配置,使用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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网! 

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com