You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

三、验证步骤

  1. 查看MySQL日志确认服务就绪:sudo docker-compose logs db,需看到ready for connections
  2. 查看Django服务日志:sudo docker-compose logs web django_q,确认无数据库/Redis连接错误
  3. 进入web容器测试数据库连接:
sudo docker-compose exec web python manage.py shell

在shell中执行:

from django.db import connection
connection.ensure_connection()

无报错则说明连接正常

内容的提问来源于stack exchange,提问作者Jingda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 10:05:27