【问题标题】:SpringBoot app in Docker not connecting to MySQL dbDocker中的Spring Boot应用程序未连接到MySQL db
【发布时间】:2021-04-24 08:15:09
【问题描述】:

MySQL 进程已启动并可访问,但 Spring 无法连接并停止:

 java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.

Docker-compose 是这样的:

version: '3'

services:
  mysql-db:
    image: mysql:latest
    container_name: mysql_demo
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: demo
      MYSQL_USER: root
      MYSQL_PASSWORD: secret
    ports:
      - "3306:3306"

  spring-rest-api:
    build:
      context: ./
      dockerfile: Dockerfile
    container_name: rest_api
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://mysql-db:3306/demo?autoReconnect=true&useSSL=false
      DB_USER: root
      DB_PWD: secret
      DB_NAME: demo
    volumes:
      - ./data/applogs:/tmp/logs
    ports:
      - 8080:8080
    depends_on:
      - mysql-db

我可以连接到 MySQL 容器,并且可以从容器内部连接到 MySQL。 从主机 PC 我不能,但我认为 MySQL 客户端无法通过 tcp 连接是一个问题(或者我做不到)。

不管怎样,SpringBoot 启动正常但无法连接然后崩溃。 在没有 Docker 的情况下,应用程序可以正常工作。

我在日志中也注意到了

Caused by: com.mysql.cj.exceptions.UnableToConnectException: Public Key Retrieval is not allowed

我有点受阻...

【问题讨论】:

  • 刚刚找到 &allowPublicKeyRetrieval=true 并添加到 url...它似乎工作...

标签: mysql spring-boot docker


【解决方案1】:

错误消息是不言自明的。经过一番搜索,我找到了需要添加到数据源URL的参数

 spring.datasource.url=jdbc:mysql://localhost/ny_database?autoReconnect=true&allowPublicKeyRetrieval=true&useSSL=false

在 docker-compose 中,我还必须将 localhost 更改为此

services:
 ....
 restapi:
 ....
   environment:
    SPRING_DATASOURCE_URL: jdbc:mysql://mysqldocker:3306/my_database?autoReconnect=true&allowPublicKeyRetrieval=true&useSSL=false
 ....
 mysqldocker:
 ....

【讨论】:

    猜你喜欢
    • 2023-01-23
    • 1970-01-01
    • 1970-01-01
    • 2022-07-12
    • 2019-10-19
    • 2021-02-23
    • 2021-04-22
    • 1970-01-01
    • 2021-08-02
    相关资源
    最近更新 更多