Docker Flyway MySQL 8:客户端不支持服务器请求的身份验证协议。考虑升级 MariaDB 客户端

Posted

技术标签:

【中文标题】Docker Flyway MySQL 8:客户端不支持服务器请求的身份验证协议。考虑升级 MariaDB 客户端【英文标题】:Docker Flyway MySQL 8 : Client does not support authentication protocol requested by server. Consider upgrading MariaDB client 【发布时间】:2019-01-11 04:44:52 【问题描述】:

我在 docker 容器中运行我的应用程序,其中 flyway 迁移工具在连接到 mysql DB (8.0.11) 时出错: 这是完整的错误:

无法从数据库 (jdbc:mysql://docker-mysql:3306) 获取用户“deepti”的连接:
客户端不支持服务器请求的身份验证协议。
考虑升级 MariaDB 客户端。插件是 = caching_sha2_password

这是我的 docker-compose.yml :

版本:'3' 服务: 码头工人-mysql: 图片:mysql:8.0.11 环境: - MYSQL_ROOT_PASSWORD=... - MYSQL_DATABASE=test1 - MYSQL_USER=... - MYSQL_PASSWORD=... flyway-服务-i: 图片:boxfuse/flyway 命令:-url=jdbc:mysql://docker-mysql:3306 -schemas=test1 -user=... -password=... 迁移 卷: -“../resources/db/migration:/flyway/sql” 取决于: - 码头工人-mysql spring-boot-jpa-docker-webapp: 图片:deepti/spring-boot-docker 取决于: - 码头工人-mysql 端口: - 8080:8080 环境: - DATABASE_HOST=docker-mysql - 数据库_用户=... - 数据库密码=... - DATABASE_NAME=test1 - 数据库端口=3306

谁能帮我解决这个问题。谢谢

【问题讨论】:

相关:***.com/questions/50424900/… 【参考方案1】:

version 8.0.4 中 MySQL 的默认认证方式改为caching_sha2_password。它看起来不像MariaDB connector supports it。

您可以通过添加如下所示的command 将default authentication plugin 恢复为旧版本:

version: '3'

services: 
  docker-mysql:
    image: mysql:8.0.11
    command: --default-authentication-plugin=mysql_native_password
    environment:
...

对于数据库中已使用caching_sha2_password 身份验证方法创建的任何现有用户,您可以将用户更改为使用mysql_native_password

ALTER USER 'username'@'ip_address' IDENTIFIED WITH mysql_native_password BY 'password';

或者使用docker-compose rm 删除现有容器。

我在this repository 中创建了一个工作示例。这是成功的输出:

Flyway Community Edition 5.1.4 by Boxfuse

Database: jdbc:mysql://docker-mysql:3306/test1 (MySQL 8.0)
WARNING: You are connected to a MySQL database using the MariaDB driver. This is known to cause issues. An upgrade to Oracle's MySQL JDBC driver is highly recommended.
Successfully validated 1 migration (execution time 00:00.010s)
Creating Schema History table: `test1`.`flyway_schema_history`
Current version of schema `test1`: << Empty Schema >>
Migrating schema `test1` to version 1.0 - init
Successfully applied 1 migration to schema `test1` (execution time 00:00.290s)

如您所见,虽然它可以工作,但有一个关于在 MySQL 中使用 MariaDB 驱动程序时出现问题的警告。

另一种选择是下载官方的MySQL JDBC driver,将其添加到./drivers 目录并挂载到Flyway 容器中:

  flyway-service-i:
    image: boxfuse/flyway
    command: ...
    volumes:
     - "./sql:/flyway/sql"
     - "./drivers:/flyway/drivers"

这也有效:

Flyway Community Edition 5.1.4 by Boxfuse

Database: jdbc:mysql://docker-mysql:3306/test1 (MySQL 8.0)
Successfully validated 1 migration (execution time 00:00.011s)
Creating Schema History table: `test1`.`flyway_schema_history`
Current version of schema `test1`: << Empty Schema >>
Migrating schema `test1` to version 1.0 - init
Successfully applied 1 migration to schema `test1` (execution time 00:00.229s)

但是要摆脱以下警告:

WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

我确实需要将verifyServerCertificate=falseuseSSL=true 添加到jdbc url:

jdbc:mysql://docker-mysql:3306/test1?verifyServerCertificate=false&useSSL=true

【讨论】:

嗨,我做了更改,但仍然出现相同的错误。我从 bash 运行这个 mysql 查询: select Host,User,plugin from mysql.user;并得到输出:% |深度 | caching_sha2_password ,这意味着它仍然为 user 使用 caching_sha2_password 。 我怀疑这是因为 docker-mysql 容器已经存在,并且在添加命令之前已经使用 caching_sha2_password 创建了用户。您可以使用docker-compose rm 删除现有容器,然后重试。 @Deepti-l,我已经更新了我的答案,其中包含更新现有用户的说明、指向工作示例存储库的链接以及使用官方 MySQL JDBC 驱动程序的替代解决方案。请让我知道这是否适合您。

以上是关于Docker Flyway MySQL 8:客户端不支持服务器请求的身份验证协议。考虑升级 MariaDB 客户端的主要内容,如果未能解决你的问题,请参考以下文章

将 Flyway 添加到 MySQL Docker 容器

无法将docker Spring-Boot应用程序与docker-compose中的mysql容器和flyway连接起来

在docker中运行flyway时连接被拒绝

将环境变量传递给 Docker 时,Flyway 迁移失败

无法在 docker 容器中加载 libjli.so

使用 Docker 和 Jenkins 自动化 Flyway 迁移