You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mac迁移Linux Docker环境到Windows 10后Go连接MySQL失败

解决Windows 10 Docker环境下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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:57:41