场景:
使用docker 搭建lnmp环境,mysql构建如下
yaml
services:
db:
image: mysql:5.7
container_name: mysql-5.7
#表示支持外部访问
command: --default-authentication-plugin=mysql_native_password
restart: always
volumes:
- ./data/db_data:/var/lib/mysql
- ./config/custom-my.cnf:/etc/mysql/conf.d/custom-my.cnf
#映射到宿主机的端口,测试使用,测试完毕,请注释
ports:
- 13306:3306
env_file:
- .env
networks:
- lnmp
environment:
MYSQL_ROOT_HOST: "%"
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
custom-my.cnf内容如下:
mysqld
sql_mode = NO_ENGINE_SUBSTITUTION
但是将项目跑起来后,使用SQL语句:SHOW VARIABLES LIKE 'sql_mode'; 结果为:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
并没有生效
原因:
MySQL 对配置文件权限有严格要求。如果配置文件权限过高(如 777),MySQL 可能会出于安全考虑忽略该文件
解决过程:
首先验证:
- 进入容器
powershell
docker exec -it mysql-5.7 bash
- 检查文件加载顺序,看custom-my.cnf是否在加载文件列表里
powershell
mysqld --help --verbose | grep -A 1 "Default options"

可以看到警告:全局可写配置文件"/etc/mysql/conf.d/custom-my.cnf"被忽略
powershell
ls -l /etc/mysql/conf.d/custom-my.cnf

修改文件权限:
powershell
chmod 644 ./config/custom-my.cnf
或者直接在构建文件增加命令,命令优先级最高
