在 Docker Desktop (Windows) 上安装 MySQL 8 并启用 mysql_native_password
MySQL 8.4 开始将 mysql_native_password 从默认认证插件降级为可选插件,需要显式启用。本文记录在 Windows Docker Desktop 上安装 MySQL 8、挂载自定义配置文件并成功启用 mysql_native_password 的完整过程,以及踩坑记录。
环境准备
- Windows 10/11
- Docker Desktop(已安装并运行)
- MySQL 镜像:
mysql:8(最新稳定版)
一、准备目录结构
在宿主机上预先创建挂载目录,Docker 不会自动创建宿主机目录。
1 | |
最终目录结构如下:
1 | |
二、编写配置文件
在 E:\Docker\mount\mysql8\conf\conf.d\ 下新建 custom.cnf,内容如下:
1 | |
注意事项:
- 启用
mysql_native_password的正确写法是loose-mysql_native_password=ON,加loose-前缀可以让 MySQL 在不识别该选项时不报错退出,兼容性更好。 - 不需要保留
[client]段和!includedir,那是主配置文件才需要的内容。 - 配置文件放在
conf.d子目录中,文件名可以任意命名,MySQL 会自动加载该目录下所有.cnf文件。
三、启动容器
1 | |
四、解决 Windows 挂载文件权限问题(重要)
问题现象
进入容器执行 mysql -uroot -p 后,出现以下警告:
1 | |
原因分析
Windows NTFS 文件系统挂载进 Docker 容器后,文件权限默认为 777(全局可写)。MySQL 出于安全考虑,会直接忽略权限过于宽松的配置文件,导致所有自定义配置(包括 mysql_native_password=ON)都未生效。
在 Linux 上可以直接用 chmod 644 解决,但 Windows 上 chmod 对 NTFS 无效,且每次容器重建权限都会重置回 777。
解决方案:容器启动时自动修复权限
删除旧容器,重新用以下命令启动(加入 --entrypoint 覆盖启动脚本,在启动 MySQL 前先修复权限):
1 | |
这样每次容器启动时都会先将配置文件权限修复为 644,再正常启动 MySQL,权限修复永久生效。
五、验证配置是否生效
进入容器:
1 | |
不再出现 World-writable 警告后,执行以下 SQL 验证插件状态:
1 | |
若输出如下,说明插件已成功启用:
1 | |
六、创建使用 mysql_native_password 的用户
1 | |
踩坑小结
| 问题 | 原因 | 解决方法 |
|---|---|---|
| 配置文件被忽略(World-writable) | Windows 挂载文件权限默认 777 | 启动时用 bash -c "chmod 644 ..." 修复 |
mysql_native_password=ON 写法错误 |
MySQL 8.4 改变了配置项名称 | 改为 loose-mysql_native_password=ON |
直接挂载 my.cnf 单文件仍报权限警告 |
同上,Windows 挂载权限问题 | 改为挂载 conf.d 目录并用 entrypoint 修复 |
conf.d 目录不存在导致启动失败 |
Docker 不自动创建宿主机目录 | 启动前手动 mkdir 创建 |
在 Docker Desktop (Windows) 上安装 MySQL 8 并启用 mysql_native_password
http://eevann.cn/2026/05/28/docker-mysql8-native-password/