有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用DockerCompose运行多个SpringBoot应用程序

我有两个Spring应用程序共享同一个Mysql数据库。 当我在没有docker compose的情况下运行它们时,它们工作得非常好。我的主机是Windows 10 professional

应用程序。性质

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 Error: 0, SQLState: 08S01 solver_1 | 2019-01-04 22:55:15.698 ERROR 1 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : Communications link failure solver_1 | solver_1 | The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

配置中缺少什么?当运行组合时application.properties是否被忽略


共 (3) 个答案

  1. # 1 楼答案

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

    在容器内运行时,还尝试针对localhost建立连接(但这次是在spring boot docker容器内)。这显然是失败的,因为在spring引导容器中没有mysql在运行

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

    重新配置弹簧。数据源。链接到

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

    这可以在应用程序中完成。属性或使用docker compose文件中的环境变量

  2. # 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撰写。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. # 3 楼答案

    而不是在应用程序中硬编码MySQL数据源字符串。属性,您可以从docker compose配置传递它。此外,您正在使用docker compose中定义的服务名称“database”在应用程序中创建硬编码条目。财产

    请避免这样做,并执行以下操作:

       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公共应用程序属性转换为环境变量带下划线(41;