需要配置成只读权限
chmod 444 /home/user/mysql/my.cnf
逐步检查及修复建议
1. 检查配置文件挂载路径
问题风险:
- 如果宿主机路径
/ltkj/mysql/my.cnf
是 目录 而非文件,会导致容器内的/etc/mysql/conf.d/my.cnf
变成目录,MySQL 无法读取配置。 - 若宿主机文件不存在,Docker 会默认创建空目录,导致配置丢失。
验证步骤:
-
确认宿主机文件存在:
ls -l /ltkj/mysql/my.cnf
- 输出应为
-rw-r--r-- ... /ltkj/mysql/my.cnf
(文件属性)。 - 如果显示
drwxr-xr-x
,说明是目录,需删除后重建为文件。
- 输出应为
-
确认容器内配置文件内容:
# 进入容器查看配置 docker exec -it mysql-test bash cat /etc/mysql/conf.d/my.cnf
预期内容:
[mysqld] lower_case_table_names=1
2. 检查数据目录冲突
问题风险:
- 若
/ltkj/mysql/mysql_data/
包含旧数据且已初始化过,修改lower_case_table_names
会导致 MySQL 启动失败。
解决方案:
- 清理旧数据目录:
docker stop mysql-test && docker rm mysql-test rm -rf /ltkj/mysql/mysql_data/*
- 重新启动容器:
docker run --name mysql-test \ -e MYSQL_ROOT_PASSWORD=ltkj \ -v /ltkj/mysql/my.cnf:/etc/mysql/conf.d/my.cnf \ -v /ltkj/mysql/mysql_data/:/var/lib/mysql \ -p 13306:3306 \ -d mysql:8.0.39
3. 验证 MySQL 配置
关键命令:
-
查看
lower_case_table_names
值:docker exec -it mysql-test mysql -uroot -pltkj -e "SHOW VARIABLES LIKE 'lower_case_table_names';"
预期输出:
+------------------------+-------+ | Variable_name | Value | +------------------------+-------+ | lower_case_table_names | 1 | +------------------------+-------+
-
检查 MySQL 错误日志:
docker logs mysql-test 2>&1 | grep -i error
- 若出现类似
Different lower_case_table_names settings
的错误,说明数据目录未清理干净。
- 若出现类似
4. 配置文件权限问题
问题风险:
- 若宿主机文件权限不足,容器内 MySQL 用户(
mysql:mysql
)无法读取配置。
修复方法:
chmod 644 /ltkj/mysql/my.cnf # 确保文件可读
chown -R 999:999 /ltkj/mysql/mysql_data/ # MySQL 容器用户UID/GID通常为999
5. 完整正确的命令示例
# 1. 创建配置文件
mkdir -p /ltkj/mysql
echo -e "[mysqld]\nlower_case_table_names=1" > /ltkj/mysql/my.cnf
# 2. 清理旧数据
rm -rf /ltkj/mysql/mysql_data/*
# 3. 启动容器
docker run --name mysql-test \
-e MYSQL_ROOT_PASSWORD=ltkj \
-v /ltkj/mysql/my.cnf:/etc/mysql/conf.d/my.cnf \
-v /ltkj/mysql/mysql_data/:/var/lib/mysql \
-p 13306:3306 \
-d mysql:8.0.39
故障排除流程图
检查宿主机文件是否存在 → 确认是文件而非目录 → 验证文件内容 → 清理数据目录 → 重启容器 → 登录验证配置
通过以上步骤,可确保配置正确生效。如果仍失败,请提供执行日志 (docker logs mysql-test
) 进一步分析。