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=false 和useSSL=true 添加到jdbc url:
jdbc:mysql://docker-mysql:3306/test1?verifyServerCertificate=false&useSSL=true