Docker部署Django+MySQL遇only_full_group_by报错,修改SQL_MODE无效求助
解决Docker部署MySQL 8时的
only_full_group_by报错问题 问题根源
你通过SET GLOBAL sql_mode做的修改是临时的——容器重启后,MySQL会加载镜像默认的配置,之前的修改会完全丢失。另外MySQL 8的Docker镜像里没有service命令,没法用它重启服务。
两种永久解决办法
办法1:挂载自定义配置文件
- 在本地项目目录下新建
my.cnf文件,写入以下内容:
[mysqld] sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
(这是MySQL默认sql_mode去掉ONLY_FULL_GROUP_BY后的配置,你可以按需调整)
- 修改你的
docker-compose.yml,给db_mysql服务添加配置文件挂载:
db_mysql: image: mysql:8 container_name: db_mysql restart: always environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: database_name MYSQL_USER: user MYSQL_PASSWORD: password ports: - '3306:3306' expose: - '3306' volumes: - dbdata:/var/lib/mysql - ./my.cnf:/etc/mysql/conf.d/my.cnf # 挂载自定义配置到容器内
- 重启容器生效:
docker-compose down && docker-compose up -d
办法2:通过环境变量直接设置
直接在docker-compose.yml的环境变量里指定sql_mode,省去配置文件:
db_mysql: image: mysql:8 container_name: db_mysql restart: always environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: database_name MYSQL_USER: user MYSQL_PASSWORD: password # 设置初始化时的sql_mode MYSQL_INITDB_SQL_MODE: STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION ports: - '3306:3306' expose: - '3306' volumes: - dbdata:/var/lib/mysql
同样执行docker-compose down && docker-compose up -d重启容器。
验证修改
进入容器登录MySQL后执行:
SELECT @@sql_mode;
确认输出里没有ONLY_FULL_GROUP_BY就说明配置生效了。
内容的提问来源于stack exchange,提问作者Alonso
相关产品推荐
相关产品推荐

