使用docker compose运行多个spring boot应用程序

eivgtgni  于 2021-06-16  发布在  Mysql
关注(0)|答案(3)|浏览(415)

我有两个spring应用程序共享同一个mysql数据库。当我在没有docker的情况下运行它们时,它们工作得非常好。我的主机是windows10professional。
应用程序属性

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|2019-01-04 22:55:15.698 warn 1---[main]o.h.engine.jdbc.spi.sqlexceptionhelper:sql错误:0,sqlstate:08s01 solver|2019-01-04 22:55:15.698错误1---[main]o.h.engine.jdbc.spi.sqlexceptionhelper:communications link failure solver|solver|1 |成功发送到服务器的最后一个数据包是0毫秒前。驱动程序尚未从服务器接收到任何数据包。
配置中缺少什么?做 application.properties 在运行排版时是否忽略?

h5qlskok

h5qlskok1#

我终于可以运行这个应用程序了。
以下是配置

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: {}
svmlkihl

svmlkihl2#

spring引导应用程序尝试连接到localhost:3306. 只要它们不在容器中运行,就可以正常工作。
当在容器中运行时,还尝试针对localhost建立连接(但这次是在spring boot docker容器中)。这显然失败了,因为在spring引导容器中没有mysql在运行。
mysql服务可以通过其别名(数据库)在docker网络中访问。
将spring.datasource.url重新配置为

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

这可以在application.properties中完成,也可以在docker compose文件中使用环境变量。

ruyhziif

ruyhziif3#

不用在application.properties中硬编码mysql数据源字符串,您可以从docker compose配置传递它。此外,您正在使用docker compose中定义的服务名称“database”在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公共应用程序属性转换为环境变量,方法是将点(.)替换为下划线(\)

相关问题