docker版mysql配置必须挂载到/etc/mysql/conf.d/才生效,因官方8.0/5.7镜像仅自动加载该目录及mysql.conf.d/下以.cnf结尾的文件;挂载my.cnf到/etc/mysql/my.cnf无效,且须含[mysqld]、skip-host-cache、skip-name-resolve、character-set-server=utf8mb4和default-authentication-plugin=mysql_native_password,改后必须docker restart。

直接挂载到 /etc/mysql/conf.d/ 才生效,改 /etc/mysql/my.cnf 是白忙活。
为什么 docker run -v ./my.cnf:/etc/mysql/my.cnf 不起作用?
官方 mysql:8.0 和 mysql:5.7 镜像压根不读 /etc/mysql/my.cnf —— 它只自动加载 /etc/mysql/conf.d/ 和 /etc/mysql/mysql.conf.d/ 下所有以 .cnf 结尾的文件。你挂载过去,容器启动时根本不会扫描那个路径。
- 现象:容器反复卡在
getaddrinfo failed或长时间无日志输出后退出 - 本质:MySQL 启动时尝试做 DNS 反向解析,而宿主机网络环境或容器内部 DNS 配置不可靠
- 解决:必须把配置文件放到
/etc/mysql/conf.d/下,且文件名以.cnf结尾(如mysqld.cnf)
配置文件里至少要写哪几行?
哪怕你只打算调 max_connections,也得先保底写这四行,否则容器大概率起不来:
[mysqld] skip-host-cache skip-name-resolve character-set-server = utf8mb4 default-authentication-plugin = mysql_native_password
-
skip-host-cache和skip-name-resolve是启动前提,跳过 DNS 解析环节 -
character-set-server = utf8mb4单独设不够,必须配套default-authentication-plugin - MySQL 8.0 默认用
caching_sha2_password,但 Navicat ≤12、SQLyog、老版 JDBC 会报Authentication plugin 'caching_sha2_password' cannot be loaded - 如果数据目录
/var/lib/mysql已存在,仅改配置还不够,还得进容器执行:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
挂载后怎么确认配置生效?
改完必须 docker restart,mysqladmin reload、kill -HUP、甚至进容器 service mysql restart 全无效。
- 验证字符集:
docker exec -it mysql mysql -uroot -p$MYSQL_ROOT_PASSWORD -e "SHOW VARIABLES LIKE 'character_set_server';" - 验证插件:
docker exec -it mysql mysql -uroot -p$MYSQL_ROOT_PASSWORD -e "SELECT plugin FROM mysql.user WHERE user='root';" - 检查是否加载了你的文件:
docker exec -it mysql ls /etc/mysql/conf.d/看文件名是否存在,再cat内容核对语法(不能有中文标点、等号前后不能有空格)
最常被忽略的是:配置文件挂载后没加 :ro,结果容器内进程意外改写它;或者以为改了 my.cnf 就完事,实际那文件在镜像里只是个占位符,根本没被加载。











