官方MySQL镜像(mysql:8.0/5.7)仅自动加载 /etc/mysql/conf.d/ 和 /etc/mysql/mysql.conf.d/ 下的 .cnf 文件,不读取 /etc/mysql/my.cnf;挂载时须用 -v ./conf/my.cnf:/etc/mysql/conf.d/my.cnf:ro,且配置必须含 skip-host-cache 和 skip-name-resolve,否则启动卡DNS;还需同步设置 character-set-server=utf8mb4 与 default-authentication-plugin=mysql_native_password,修改后必须 docker restart 生效。

挂载 my.cnf 到 /etc/mysql/conf.d/ 才生效
官方 MySQL 镜像(mysql:8.0、mysql:5.7)**不会读取 /etc/mysql/my.cnf 顶层配置文件**,只自动加载 /etc/mysql/conf.d/ 和 /etc/mysql/mysql.conf.d/ 下所有以 .cnf 结尾的文件。直接挂载到 /etc/mysql/my.cnf 会被忽略——这是最常踩的坑。
正确做法是:
- 把自定义配置文件(如
my.cnf)放在宿主机任意路径,例如./conf/my.cnf - 用
-v ./conf/my.cnf:/etc/mysql/conf.d/my.cnf:ro挂载(:ro表示只读,防容器内误改) - 确保文件内容以
[mysqld]开头,且不含语法错误(比如漏掉右括号、引号不匹配)
my.cnf 内容必须含 skip-host-cache 和 skip-name-resolve
不加这两项,容器启动时会卡在 DNS 解析阶段,日志里反复出现 getaddrinfo failed 或长时间无响应,最终可能超时退出。
[mysqld] 段至少应包含:
[mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci skip-host-cache skip-name-resolve
其他参数如 innodb_buffer_pool_size、max_connections 可按需添加,但这两项是底线。
修改后必须重启容器,不能 reload
MySQL 容器内进程不支持 mysqladmin reload 或 SIGHUP 动态重载配置。挂载更新 my.cnf 后,必须执行:
docker restart <container_name></container_name>
注意:如果数据目录 /var/lib/mysql 已非空(即不是首次初始化),重启不会清空数据,但新配置会在下次 mysqld 启动时生效。若发现配置未生效,可用以下命令确认:
docker exec -it <container_name> mysql -uroot -p$MYSQL_ROOT_PASSWORD -e "SHOW VARIABLES LIKE 'character_set_server';" </container_name>
字符集和认证插件要同步配,否则连不上
仅在 my.cnf 里设 character-set-server=utf8mb4 不够。MySQL 8.0 默认用 caching_sha2_password 插件,而很多客户端(尤其是旧版 Navicat、SQLyog、某些 JDBC 驱动)不兼容,会报错 Authentication plugin 'caching_sha2_password' cannot be loaded。
解决方法二选一:
- 在
my.cnf的[mysqld]段加:default-authentication-plugin=mysql_native_password - 或启动时用命令行覆盖:
--default-authentication-plugin=mysql_native_password
这两项(字符集 + 认证插件)必须同时处理,缺一不可。单独改一个,大概率导致初始化成功但后续连接失败。
真正麻烦的点在于:配置文件挂载路径、权限、DNS 参数、认证插件、字符集,这五者只要漏掉一个,容器就可能起不来或连不上——它们不是孤立选项,而是相互依赖的启动条件。











