【问题标题】:Run multiple Spring-Boot apps with Docker-Compose使用 Docker-Compose 运行多个 Spring-Boot 应用程序
【发布时间】:2019-05-31 05:41:25
【问题描述】:

我有两个 Spring 应用程序共享同一个 Mysql 数据库。 当我在没有 docker-compose 的情况下运行它们时,它们可以完美运行。我的主机是 Windows 10 专业版。

application.properties

server.port=8085
spring.jpa.show-sql=true
spring.jackson.serialization.write-dates-as-timestamps=false
spring.jpa.hibernate.ddl-auto=update
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306 /webDatabase?autoReconnect=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=my-secret-pw

Dockerfile

FROM openjdk:8-jdk-alpine
ADD target/web-spring-boot.jar web-spring-boot.jar
EXPOSE 8085
ENTRYPOINT ["java","-jar", "web-spring-boot.jar"]

我根据其他示例创建了这个 docker-compose.yml。

version: '3'
services:
  web:
    build: ./web
    ports:
    - "8085:8085"
    depends_on:
    - "database"
  solver:
    build: ./solver
    ports:
    - "8095:8095"
    depends_on:
    - "database"
  database:
    image: "mysql:latest"
    ports:
    - "3306:3306"
    environment:
    - MYSQL_ROOT_PASSWORD=my-secret-pw
    - MYSQL_DATABASE=webDatabase
    healthcheck:
            test: "/usr/bin/mysql --user=root --password=my-secret-pw --execute \"SHOW DATABASES;\""
            interval: 10s
            timeout: 20s
            retries: 10
volumes:
  logvolume01: {}

它不起作用。启动后只有 Mysql 容器在运行。

这是 Spring 日志的部分输出

solver_1 | 2019-01-04 22:55:15.698 WARN 1 --- [main] o.h.engine.jdbc.spi.SqlExceptionHelper:SQL 错误:0,SQLState:08S01 求解器_1 | 2019-01-04 22:55:15.698 错误 1 ​​--- [main] o.h.engine.jdbc.spi.SqlExceptionHelper:通信链路故障 求解器_1 | 求解器_1 |最后一个成功发送到服务器的数据包是 0 毫秒前。驱动没有收到服务器发来的任何数据包。

我在配置中缺少什么? application.properties 使用 compose 运行时会被忽略吗?

【问题讨论】:

  • 两个问题,你确定web Dockerfile实际上是在./web 下吗?你用什么命令来运行 docker 和 docker-compose?
  • @plumSemPy 是的,我可以看到两个春季初创企业。我正在添加部分日志。要运行它们,只需 docker runafter docker build
  • @Ritabrata 我没有看到这种关系。

标签: java mysql spring-boot docker


【解决方案1】:

您可以从 docker-compose 配置中传递它,而不是在 application.properties 中硬编码 MySQL 数据源字符串。此外,您正在使用 docker-compose 中定义的服务名称“数据库”在 application.properties 中创建硬编码条目。

请避免这样做:

   version: '3'
    services:
      web:
        build: ./web-spring
        ports:
        - "8085:8085"
        depends_on:
        - "database"
    environment:
    - SPRING_DATASOURCE_URL=jdbc:mysql://database:3306/mysqldatabase?useSSL=false&allowPublicKeyRetrieval=true
    volumes:
    - /data/spring-boot-app
  solver:
    build: ./solver
    ports:
    - "8095:8095"
    depends_on:
    - "database"
    - "web"
    environment:
    - SPRING_DATASOURCE_URL=jdbc:mysql://database:3306/mysqldatabase?useSSL=false&allowPublicKeyRetrieval=true
  database: 
    image: "mysql:latest"
    ports:
    - "3306:3306"
    environment:
    - MYSQL_ROOT_PASSWORD=my-secret-pw
    - MYSQL_DATABASE=mysqldatabase
    volumes:
      - /data/mysql
    healthcheck:
      test: ["CMD", "mysqldatabase" ,"ping", "-h", "database"]
      timeout: 1s
      retries: 100
volumes:
  logvolume01: {}

注意:您可以通过将点(.)替换为下划线(_)来将任何 Spring Boot 通用应用程序属性转换为环境变量

【讨论】:

    【解决方案2】:

    我终于能够运行该应用程序了。

    这里是配置

    server.port=8095
    spring.jpa.show-sql=true
    spring.jackson.serialization.write-dates-as-timestamps=false
    #spring.h2.console.enabled=true
    spring.jpa.hibernate.ddl-auto=update
    spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
    spring.datasource.url=jdbc:mysql://database:3306/mysqldatabase?useSSL=false&allowPublicKeyRetrieval=true
    spring.datasource.username=root
    spring.datasource.password=my-secret-pw
    

    docker-compose.yml

    version: '3'
    services:
      web:
        build: ./web-spring
        ports:
        - "8085:8085"
        depends_on:
        - "database"
        volumes:
        - /data/spring-boot-app
      solver:
        build: ./solver
        ports:
        - "8095:8095"
        depends_on:
        - "database"
        - "web"    
      database: 
        image: "mysql:latest"
        ports:
        - "3306:3306"
        environment:
        - MYSQL_ROOT_PASSWORD=my-secret-pw
        - MYSQL_DATABASE=mysqldatabase
        volumes:
          - /data/mysql
        healthcheck:
          test: ["CMD", "mysqldatabase" ,"ping", "-h", "database"]
          timeout: 1s
          retries: 100
    volumes:
      logvolume01: {}
    

    【讨论】:

      【解决方案3】:

      Spring-Boot 应用程序尝试连接到 localhost:3306。只要它们不在容器中运行,它就可以正常工作。

      在容器中运行时,也会尝试建立与 localhost 的连接(但这次是在 spring-boot docker 容器中)。这显然失败了,因为在您的 spring-boot 容器中没有运行 mysql。

      mysql 服务可以通过它的别名(数据库)在 docker 网络中访问。

      将你的 spring.datasource.url 重新配置为

      spring.datasource.url=jdbc:mysql://database:3306/webDatabase?autoReconnect=true&useSSL=false
      

      这可以在您的 application.properties 中完成,也可以通过在 docker-compose 文件中使用环境变量来完成。

      【讨论】:

      • 似乎有所改善。但是,我现在收到此错误“web_1 | 2019-01-04 21:57:09.037 WARN 1 --- [nio-8085-exec-2] ohengine.jdbc.spi.SqlExceptionHelper:SQL 错误:1046, SQLState:3D000 web_1 | 2019-01-04 21:57:09.037 错误 1 ​​--- [nio-8085-exec-2] ohengine.jdbc.spi.SqlExceptionHelper:未选择数据库”
      • 您是否添加了 /webDatabase?autoReconnect=true&useSSL=false 部分?由于空间,我错过了它
      • 我正在尝试以这些人为例:springbootdev.com/2018/01/08/…
      猜你喜欢
      • 2021-12-15
      • 1970-01-01
      • 2018-10-04
      • 2021-08-26
      • 1970-01-01
      • 2019-07-05
      • 2021-09-14
      • 2019-08-30
      • 2021-07-26
      相关资源
      最近更新 更多