Docker Compose部署Django服务时MySQL连接权限错误修复
修复Docker Compose部署中Django服务的MySQL权限及后续配置错误
一、先解决初始的1045权限错误
1. 核对配置一致性
检查docker-compose.yml中MySQL服务的环境变量,确保MYSQL_USER、MYSQL_PASSWORD、MYSQL_DATABASE与Djangosettings.py里的DATABASES配置完全匹配(注意大小写,MySQL部分场景下区分大小写):
- docker-compose.yml示例(MySQL服务段):
services: db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_USER: kds_admin MYSQL_PASSWORD: admin123 MYSQL_DATABASE: kds_db volumes: - mysql_data:/var/lib/mysql
- settings.py示例(数据库配置段):
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'kds_db', 'USER': 'kds_admin', 'PASSWORD': 'admin123', 'HOST': 'db', # 必须用docker-compose中MySQL的服务名,不能写容器IP 'PORT': '3306', } }
重点:Django的数据库HOST必须填写docker-compose里的MySQL服务名(比如上面的db),容器IP会随重启变化,Docker内置DNS会自动解析服务名到对应容器。
2. 清理旧的MySQL持久化数据
如果之前启动过MySQL容器,旧的用户权限数据可能残留,即使修改环境变量也不会重新初始化:
- 停止并清理所有服务及挂载卷:
sudo docker-compose down -v - 重新构建并启动:
sudo docker-compose up --build
3. 手动授权用户权限
如果上述步骤无效,进入MySQL容器手动刷新权限:
- 进入容器:
sudo docker exec -it <你的MySQL容器名> mysql -uroot -p(输入root密码) - 执行授权语句:
GRANT ALL PRIVILEGES ON kds_db.* TO 'kds_admin'@'%' IDENTIFIED BY 'admin123'; FLUSH PRIVILEGES;
- 重启Django相关服务:
sudo docker-compose restart web django_q
二、更新配置后新错误的通用排查方案
1. 数据库连接超时/无法访问
MySQL启动慢,仅靠depends_on无法确保服务就绪,需添加健康检查:
services: web: build: . depends_on: db: condition: service_healthy redis: condition: service_started django_q: build: . depends_on: db: condition: service_healthy redis: condition: service_started db: image: mysql:8.0 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}"] interval: 5s timeout: 5s retries: 5
2. Django迁移错误(如表不存在)
手动执行迁移命令:
# 执行Django主应用迁移 sudo docker-compose exec web python manage.py makemigrations sudo docker-compose exec web python manage.py migrate # 若为django_q的表问题,执行专属迁移 sudo docker-compose exec web python manage.py qmigrate
3. Redis连接错误
检查settings.py中django_q的Redis配置,HOST必须用docker-compose中的Redis服务名:
Q_CLUSTER = { 'name': 'DjangORM', 'workers': 4, 'timeout': 90, 'retry': 120, 'queue_limit': 50, 'bulk': 10, 'orm': 'default', 'redis': { 'host': 'redis', 'port': 6379, 'db': 0, } }
4. 容器网络问题
确保所有服务在同一Docker网络中(默认docker-compose会自动创建,若手动指定需统一):
networks: app_network: driver: bridge services: db: networks: - app_network redis: networks: - app_network web: networks: - app_network django_q: networks: - app_network
三、验证步骤
- 查看MySQL日志确认服务就绪:
sudo docker-compose logs db,需看到ready for connections - 查看Django服务日志:
sudo docker-compose logs web django_q,确认无数据库/Redis连接错误 - 进入web容器测试数据库连接:
sudo docker-compose exec web python manage.py shell
在shell中执行:
from django.db import connection connection.ensure_connection()
无报错则说明连接正常
内容的提问来源于stack exchange,提问作者Jingda
相关产品推荐
相关产品推荐

