Windows Server部署Docker MySQL出现root空密码导致连接故障
问题排查结论
你的启动命令没有核心逻辑错误,但存在Windows环境适配、镜像初始化逻辑的常见踩坑,直接导致了root空密码、Spring Boot连接失败的问题。
- Windows shell 特殊字符截断问题
你当前在Windows Server环境执行的命令中,环境变量的值没有用双引号包裹,而密码sEe@21包含@特殊字符,在默认的cmd/PowerShell执行环境下会被shell截断解析。从你贴的运行日志就能对应上:日志里清晰记录了Creating database emp_db的流程,说明没有特殊字符的MYSQL_DATABASE变量是成功传入容器的;但带@特殊字符的密码变量因为没加引号被截断,最终传入容器的MYSQL_ROOT_PASSWORD实际是空值,直接触发了日志里“root空密码创建”的警告。 - MySQL镜像初始化逻辑的幂等特性
MySQL官方镜像只会在首次启动、数据存储目录完全为空的前提下,读取环境变量完成密码设置、数据库创建。如果之前启动残留了匿名卷、旧数据文件,哪怕你重新执行新的启动命令,配置的环境变量会被直接跳过,沿用旧数据的配置。 - 默认连接配置不兼容外部服务
MySQL镜像默认只允许root用户从容器内部localhost连接,不允许外部主机访问;同时MySQL 8.0以上版本默认使用caching_sha2_password认证插件,老旧版本Spring Boot的mysql-connector驱动不兼容,哪怕密码、端口都配对了也会握手失败。
可直接落地的修复步骤
- 彻底清理之前的残留数据,避免旧配置干扰:
- 强制删除现有报错的容器:
docker rm -f mysql_emp - 清理所有未被容器引用的匿名卷(没有重要数据的前提下直接执行):
docker volume prune
- 强制删除现有报错的容器:
- 执行修正后的启动命令,补上适配Windows和外部连接的必要配置:
关键参数说明:docker run -e "MYSQL_ROOT_PASSWORD=sEe@21" -e "MYSQL_DATABASE=emp_db" -e "MYSQL_ROOT_HOST=%" -p 3306:3306 --name mysql_emp -v D:/docker/mysql_emp/data:/var/lib/mysql mysql --default-authentication-plugin=mysql_native_password- 所有环境变量值加双引号包裹,避免Windows shell对@这类特殊字符的截断解析
MYSQL_ROOT_HOST=%:放开root用户的连接来源限制,允许容器外的Spring Boot服务连接- 固定挂载本地数据目录:不再随机分配匿名卷,避免旧数据残留导致的配置失效
- 末尾的
--default-authentication-plugin=mysql_native_password:将认证方式改为兼容旧版Spring Boot驱动的模式,解决握手报错
- 启动完成后先做连通性验证:用数据库客户端用
root/sEe@21、3306端口连接,确认能正常访问、存在emp_db库,再启动Spring Boot服务即可。
内容的提问来源于stack exchange,提问作者JAVA_CAT
相关产品推荐
相关产品推荐

