在 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
2
mkdir E:\Docker\mount\mysql8\data
mkdir E:\Docker\mount\mysql8\conf\conf.d

最终目录结构如下:

1
2
3
4
5
E:\Docker\mount\mysql8\
├── data\ # MySQL 数据目录
└── conf\
└── conf.d\ # 自定义配置目录
└── custom.cnf # 自定义配置文件

二、编写配置文件

E:\Docker\mount\mysql8\conf\conf.d\ 下新建 custom.cnf,内容如下:

1
2
3
4
5
6
7
8
9
10
[mysqld]
host-cache-size=0
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
lower_case_table_names=1
loose-mysql_native_password=ON

注意事项:

  • 启用 mysql_native_password 的正确写法是 loose-mysql_native_password=ON,加 loose- 前缀可以让 MySQL 在不识别该选项时不报错退出,兼容性更好。
  • 不需要保留 [client] 段和 !includedir,那是主配置文件才需要的内容。
  • 配置文件放在 conf.d 子目录中,文件名可以任意命名,MySQL 会自动加载该目录下所有 .cnf 文件。

三、启动容器

1
2
3
4
5
6
7
docker run -d `
--name mysql8-server `
-p 13306:3306 `
-v E:\Docker\mount\mysql8\data:/var/lib/mysql `
-v E:\Docker\mount\mysql8\conf\conf.d:/etc/mysql/conf.d `
-e MYSQL_ROOT_PASSWORD=YourPassword `
mysql:8

四、解决 Windows 挂载文件权限问题(重要)

问题现象

进入容器执行 mysql -uroot -p 后,出现以下警告:

1
mysql: [Warning] World-writable config file '/etc/mysql/conf.d/custom.cnf' is ignored.

原因分析

Windows NTFS 文件系统挂载进 Docker 容器后,文件权限默认为 777(全局可写)。MySQL 出于安全考虑,会直接忽略权限过于宽松的配置文件,导致所有自定义配置(包括 mysql_native_password=ON)都未生效。

在 Linux 上可以直接用 chmod 644 解决,但 Windows 上 chmod 对 NTFS 无效,且每次容器重建权限都会重置回 777

解决方案:容器启动时自动修复权限

删除旧容器,重新用以下命令启动(加入 --entrypoint 覆盖启动脚本,在启动 MySQL 前先修复权限):

1
2
3
4
5
6
7
8
9
docker run -d `
--name mysql8-server `
-p 13306:3306 `
-v E:\Docker\mount\mysql8\data:/var/lib/mysql `
-v E:\Docker\mount\mysql8\conf\conf.d:/etc/mysql/conf.d `
-e MYSQL_ROOT_PASSWORD=YourPassword `
--entrypoint "" `
mysql:8 `
bash -c "chmod 644 /etc/mysql/conf.d/*.cnf && docker-entrypoint.sh mysqld"

这样每次容器启动时都会先将配置文件权限修复为 644,再正常启动 MySQL,权限修复永久生效


五、验证配置是否生效

进入容器:

1
docker exec -it mysql8-server mysql -uroot -pYourPassword

不再出现 World-writable 警告后,执行以下 SQL 验证插件状态:

1
2
3
SELECT plugin_name, plugin_status
FROM information_schema.plugins
WHERE plugin_name = 'mysql_native_password';

若输出如下,说明插件已成功启用:

1
2
3
4
5
+-----------------------+---------------+
| plugin_name | plugin_status |
+-----------------------+---------------+
| mysql_native_password | ACTIVE |
+-----------------------+---------------+

六、创建使用 mysql_native_password 的用户

1
2
3
4
5
6
7
-- 修改 root 用户的认证方式
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'YourPassword';

-- 或创建新用户
CREATE USER 'myuser'@'%' IDENTIFIED WITH mysql_native_password BY 'YourPassword';
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%';
FLUSH PRIVILEGES;

踩坑小结

问题 原因 解决方法
配置文件被忽略(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/
作者
月下独白
发布于
2026年5月29日
许可协议