【问题标题】:docker spring boot application not able to connect to dockerized mysqldbdocker spring boot应用程序无法连接到dockerized mysqldb
【发布时间】:2021-12-27 21:09:10
【问题描述】:

下面是我的 docker-compose 文件和我的 application.yml 文件。我正在覆盖 docker-compose 文件中的 mysql jdbc url。

为什么我通过命令行运行我能够连接到在 docker 实例上运行的数据库。

mysql -uroot -proot -h127.0.0.1 -P3309

当我执行 docker-compose up 时,我收到以下错误。 Spring boot docker 实例无法连接到 mysqldb 的 docker 实例。你能帮我理解可能是什么问题吗?

reco-tracker-docker_1  | Caused by: java.lang.RuntimeException: Driver com.mysql.cj.jdbc.Driver claims to not accept jdbcUrl, "jdbc:mysql://mysqldb-docker:3309/reco-tracker-dev"
reco-tracker-docker_1  |        at com.zaxxer.hikari.util.DriverDataSource.<init>(DriverDataSource.java:110) ~[HikariCP-4.0.3.jar!/:na]
reco-tracker-docker_1  |        at com.zaxxer.hikari.pool.PoolBase.initializeDataSource(PoolBase.java:331) ~[HikariCP-4.0.3.jar!/:na]
reco-tracker-docker_1  |        at com.zaxxer.hikari.pool.PoolBase.<init>(PoolBase.java:114) ~[HikariCP-4.0.3.jar!/:na]

docker-compose.yml

version: '3.8'
services:
  mysqldb-docker:
    image: 'mysql:8.0.27'
    restart: 'unless-stopped'
    ports:
      - "3309:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_PASSWORD=root
      - MYSQL_DATABASE=reco-tracker-dev
    env_file:
      - ./.env
    volumes:
      - mysqldb:/var/lib/mysql
  reco-tracker-docker:
    image: 'reco-tracker-docker:latest'
    ports:
      - "8083:8083"
    environment:
      - SPRING_DATASOURCE_USERNAME=root
      - SPRING_DATASOURCE_PASSWORD=root
      - SPRING_DATASOURCE_URL="jdbc:mysql://mysqldb-docker:3309/reco-tracker-dev"
    depends_on: [mysqldb-docker]
volumes:
  mysqldb:

application.yml

server:
  port: 8083

spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://localhost:3306/reco-tracker
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: update
    generate-ddl: true
    show-sql: true
    database-platform: org.hibernate.dialect.MySQL8Dialect

================================ 更新

与 [@the-fool] 在 cmets 部分发表我的讨论,

  1. 我修改了文件,使 mysql db 的主机和容器端口相同,以避免任何混淆。
  2. 我还更新了要从环境中传递的 spring 数据源 url,即使它覆盖了 application.yml 中已经存在的那个。
  3. 我使用“docker-compose down --rmi all”删除了映像和卷,以便删除容器和卷。 (我之前映射了一个不同的卷,这导致 mysqldb 创建数据库时出现问题)

现在可以使用了!!!

application.yml

server:
  port: 8083

spring:
  datasource:
    username: root
    password: root
    url: ${SPRING_DATASOURCE_URL}
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: update
    generate-ddl: true
    show-sql: true
    database-platform: org.hibernate.dialect.MySQL8Dialect

Dockerfile.yml

FROM openjdk:17
ARG JAR_FILE="*.jar"
COPY target/${JAR_FILE} reco-tracker.jar
EXPOSE 8083
ENTRYPOINT ["java", "-jar","reco-tracker.jar"]

docker-compose.yml

version: '3.8'
services:
  mysqldb-docker:
    image: 'mysql:8.0.27'
    restart: 'unless-stopped'
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_PASSWORD=root
      - MYSQL_DATABASE=reco-tracker
    volumes:
      - mysqldb:/var/lib/mysql
  reco-tracker-docker:
    image: 'reco-tracker-app:v2'
    ports:
      - "8083:8083"
    environment:
      - SPRING_DATASOURCE_USERNAME=root
      - SPRING_DATASOURCE_PASSWORD=root
      - SPRING_DATASOURCE_URL=jdbc:mysql://mysqldb-docker:3306/reco-tracker
    depends_on: [mysqldb-docker]
volumes:
  mysqldb:

【问题讨论】:

    标签: mysql docker docker-compose


    【解决方案1】:

    您的问题是您试图访问已发布端口上的数据库。您正在使用映射 3309:3306 的 3009。这不起作用。您不能更改网络内容器的端口。如果要通过 docker 网络连接,则需要使用 3306。 3309 只能从主机系统获得。

    至少在这部分似乎是错误的。 (似乎双引号也可能有问题,我会引用完整的字符串或不全部引用。)

    environment:
      - SPRING_DATASOURCE_URL="jdbc:mysql://mysqldb-docker:3309/reco-tracker-dev"
    

    在您的 spring 配置中,您使用的是正确的端口,但您使用的是 localhost 作为 db 主机,这似乎也是错误的。

    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/reco-tracker
    

    我不太了解java,所以我不能告诉你它会如何表现。如果以前的 env var 将覆盖它。但就目前而言,这两个设置都略有不正确。

    我可以想象你可以通过这样做来解决它。

    
    environment:
      # fix the port here
      SPRING_DATASOURCE_URL: jdbc:mysql://mysqldb-docker:3306/reco-tracker-dev
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: root
    
    
    spring:
      datasource:
        # Use the env vars in the spring config
        url: ${SPRING_DATASOURCE_URL}
        username: ${SPRING_DATASOURCE_USERNAME}
        password: ${SPRING_DATASOURCE_PASSWORD}
    

    还要确保您的数据库命名是一致的。他们在你的帖子中似乎有点不一致。请记住,第一次启动 mysql 容器时使用的名称存储在卷中。所以要么使用您当时使用的名称,要么删除卷以使其创建新数据库,这将导致您丢失存储的数据。所以要小心你选择什么选项。

    【讨论】:

      【解决方案2】:

      您在这里尝试过 docker "networks" 吗?如果没有,则创建一个网络并在同一网络中运行容器。

      在 yaml 中,类似于:

      networks:
      -myNet
      

      【讨论】:

      • Compose 为您创建一个名为default 的网络;在大多数情况下,您不需要手动配置networks:。 Docker 文档中的Networking in Compose 有更多详细信息。
      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      • 我认为我不需要创建网络,因为 docker compose 会为其 compose 文件中的所有服务创建网络。 docs.docker.com/compose/networking 。我不确定我的 Spring Boot 服务无法连接到 mysqldb 是什么问题,任何帮助将不胜感激。
      猜你喜欢
      • 2017-12-29
      • 2020-05-17
      • 2019-11-06
      • 1970-01-01
      • 2020-04-18
      • 2019-12-24
      • 2019-08-28
      • 2021-10-23
      • 1970-01-01
      相关资源
      最近更新 更多