【已解决】docker将mysql挂载到宿主机目录后运行mysql时黑马的配置文件hm.cnf未执行且查询数据库乱码
问题描述
执行命令以下把docker上的mysql挂载到宿主机目录:
docker run -d --name mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123 -v /root/mysql/data:/var/lib/mysql -v /root/mysql/conf:/etc/mysql/conf.d -v /root/mysql/init:/docker-entrypoint-initdb.d --privileged=true mysql
然后命令行执行以下命令运行mysql后
docker exec -it mysql mysql -uroot -p
报警告:
mysql: [Warning] World-writable config file '/etc/mysql/conf.d/hm.cnf' is ignored.

且配置文件hm.cnf未执行,在运行命令 show variables like “%char%”; 后发现配置文件中配置的编码方式未生效,许多地方编码方式本应为utf-8:

查数据库表得到乱码数据:

可能的原因
1.文件权限过高:
MySQL出于安全考虑,会忽略权限设置为全局可写(777或其他包含w权限给所有用户)的配置文件。你的hm.cnf文件在宿主机挂载时可能被赋予了过高权限
权限字段解析:例如:-rwxrw-rw-
| 字段 | 含义 | 问题 |
|---|---|---|
- | 普通文件类型 | 正常 |
rwx (前三位) | 所有者(root)有 读+写+执行 权限 | 危险:配置文件不需要执行权限(.cnf 是文本文件,x 权限无意义) |
rw- (中三位) | 所属组(root组)有 读+写 权限 | 致命:同组用户可修改配置文件,违反安全原则 |
rw- (后三位) | 其他用户有 读+写 权限 | 高危:任何用户都能篡改配置文件 |
. | SELinux 安全上下文标记 | 需结合 ls -Z 查看 |
权限结论:
在 Linux/Unix 系统中,文件或目录的权限由 读(r)、写(w)、执行(x) 三种基本权限组成,分别对应不同的数字。权限分为三类用户:所有者(Owner)、所属组(Group)、其他用户(Others)。
权限数字的计算规则如下:
| 权限类型 | 符号表示 | 数字值 |
|---|---|---|
| 读 | r | 4 |
| 写 | w | 2 |
| 执行 | x | 1 |
权限数字的组成
每个用户类别(所有者、组、其他用户)的权限由对应的 r、w、x 的 数字值相加 得到。最终的权限由 三位数字 表示,例如 755:
- 第一个数字:所有者的权限(Owner)
- 第二个数字:所属组的权限(Group)
- 第三个数字:其他用户的权限(Others)
详细权限对照表
| 数字 | 符号表示 | 权限说明 |
|---|---|---|
| 0 | --- | 无权限 |
| 1 | --x | 仅执行 |
| 2 | -w- | 仅写入 |
| 3 | -wx | 写入 + 执行 |
| 4 | r-- | 仅读取 |
| 5 | r-x | 读取 + 执行 |
| 6 | rw- | 读取 + 写入 |
| 7 | rwx | 读取 + 写入 + 执行 |
- World-writable(全局可写):文件权限为
766(数字权限换算:rwx=7,rw-=6,rw-=6),导致 MySQL 拒绝加载该文件。 - 权限严重过度开放:所有用户均可读写,极不安全!
2.挂载路径覆盖问题
使用-v /root/mysql/conf:/etc/mysql/conf.d挂载时,若宿主机目录/root/mysql/conf为空或未包含完整的配置文件结构,可能导致容器内原有的默认配置文件丢失,引发配置加载异常
解决方案步骤
1. 修正配置文件权限
- 先查看当前权限:
# 查看当前权限
ls -l /root/mysql/conf/hm.cnf
- 修该当前权限为644(保留所有者和组的读写权限,全局只读)
chmod 644 /root/mysql/conf/hm.cnf
2.操作后验证
- 重新运行mysql查看发现警告消失:

- 重新执行show variables like “%char%”;发现配置文件已生效

- 重新查表发现已不再乱码

3.至此,问题若还未解决,则考虑是不是前面提到的第二个原因导致的
解决方案:
- 正确路径建议
MySQL容器的配置加载依赖于多层目录结构(如conf.d和mysql.conf.d),建议将宿主机目录挂载到整个/etc/mysql而非仅conf.d。
调整命令如下:
-v /root/mysql/conf:/etc/mysql # 替换原有的conf.d挂载
并在宿主机/root/mysql/conf目录中重建容器内默认的配置文件结构(如conf.d和mysql.conf.d子目录)
- 避免覆盖默认配置
容器首次启动时,建议通过docker cp复制容器内的默认配置文件到宿主机后再挂载:
docker run -d --name temp_mysql mysql # 临时启动容器
docker cp temp_mysql:/etc/mysql /root/mysql/conf # 复制默认配置
docker rm -f temp_mysql # 删除临时容器
- 验证配置文件加载
-
检查日志
进入容器查看MySQL的错误日志,确认配置文件是否被正确加载:
docker exec -it mysql bash
cat /var/log/mysql/error.log | grep "Configuration file"
-
手动测试配置
使用mysql --help命令验证配置是否生效:
docker exec -it mysql mysql --help | grep "cnf"
# 输出应包含你的配置文件路径(如/etc/mysql/conf.d/hm.cnf)
-
配置文件内容检查
确保hm.cnf内容符合MySQL语法规范。例如:
[mysqld]
log_bin = /var/lib/mysql/mysql-bin # 示例:启用二进制日志
避免格式错误(如多余的空格、未闭合的引号等),否则MySQL会静默忽略该文件
重启容器并检查警告是否消失:
docker restart mysql
docker exec -it mysql mysql -uroot -p -e "SHOW VARIABLES LIKE 'log_bin';"
若log_bin等配置项显示为自定义值,则配置文件已生效。
否则MySQL会静默忽略该文件
重启容器并检查警告是否消失:
docker restart mysql
docker exec -it mysql mysql -uroot -p -e "SHOW VARIABLES LIKE 'log_bin';"
若log_bin等配置项显示为自定义值,则配置文件已生效。


被折叠的 条评论
为什么被折叠?



