Mac迁移Linux Docker环境到Windows 10后Go连接MySQL失败
刚帮你梳理了这个问题,报错go-mysql: authentication plugin not supported的核心原因很清晰:MySQL 8.0及以上版本默认使用caching_sha2_password认证插件,但你的go:alpine镜像里的MySQL驱动版本可能不支持这个插件,或者Windows Docker环境的配置有小疏漏。下面是几个亲测有效的解决办法:
方法1:让MySQL容器使用兼容旧驱动的认证模式
启动MySQL容器时,通过环境变量强制指定默认认证插件为mysql_native_password(这是旧版MySQL用的插件,Go驱动肯定支持):
docker run -d \ --name mysql_host \ -e MYSQL_ROOT_PASSWORD=password \ -e MYSQL_DATABASE=dbname \ -e MYSQL_DEFAULT_AUTH=mysql_native_password \ mysql:latest
如果用docker-compose管理容器,配置可以改成这样:
version: '3' services: mysql: image: mysql:latest container_name: mysql_host environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: dbname MYSQL_DEFAULT_AUTH: mysql_native_password ports: - "3306:3306"
方法2:升级Go项目的MySQL驱动
要是不想改MySQL的配置,那就把你的Go项目里的MySQL驱动更到最新版——现在github.com/go-sql-driver/mysql的最新版本已经完全支持caching_sha2_password了。在项目根目录执行:
go get -u github.com/go-sql-driver/mysql
另外,连接字符串里最好加上tls=skip-verify(如果不需要加密连接的话),避免TLS相关的坑:
dsn := "root:password@tcp(mysql_host:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local&tls=skip-verify"
方法3:检查Docker容器的网络配置
有时候Windows上Docker的网络模式会导致容器间通信出问题,确保Go应用和MySQL容器在同一个自定义网络里:
- 先创建一个专属网络:
docker network create myapp-network
- 启动MySQL容器时加入这个网络:
docker run -d --name mysql_host --network myapp-network -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=dbname mysql:latest
- 启动Go应用容器时也加入同一个网络:
docker run -d --name go-app --network myapp-network go:alpine
这样两个容器就能通过容器名(比如mysql_host)直接通信,不会出现DNS解析或者网络隔离的问题。
顺便说下为什么Mac上能正常跑:大概率是你Mac上的mysql:latest镜像不是最新的8.x版本,或者之前启动时已经默认用了兼容的认证插件,而Windows上拉取的是全新的MySQL 8.x镜像,默认启用了caching_sha2_password,才触发了这个兼容性问题。
内容的提问来源于stack exchange,提问作者Jim

