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

Docker化Django应用无法连接MySQL数据库的问题求助

解决Docker化Django连接MySQL失败的问题

针对你遇到的_mysql_connector.MySQLInterfaceError: Can't connect to MySQL server on 'db:3306' (99)错误,以下是具体修复方案:

1. 修正Django数据库配置键名错误

你的settings.py中DATABASES配置存在键名错误,Django的MySQL数据库配置使用标准键名,而非自定义的MYSQL_DATABASE等:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': MYSQL_DATABASE,  # 替换原MYSQL_DATABASE
        'USER': MYSQL_USER,
        'PASSWORD': MYSQL_PASSWORD,
        'HOST': MYSQL_HOST,
        'PORT': 3306,
    },
}

说明:MYSQL_ROOT_PASSWORD不属于DATABASES配置项,直接删除即可。

2. 修复docker-compose环境变量引号问题

docker-compose.yml中MySQL环境变量的单引号会导致数据库名、用户名被包含引号,引发识别错误,去掉所有单引号:

services:
  db:
    environment:
      - MYSQL_DATABASE=model_db
      - MYSQL_USER=root
      - MYSQL_PASSWORD=password
      - MYSQL_ROOT_PASSWORD=password

3. 处理数据库启动延迟问题

depends_on仅保证服务启动顺序,不会等待MySQL完全就绪。可以给web服务添加启动前等待脚本:
修改docker-compose.yml的web服务command:

web:
  command: >
    sh -c "
      until nc -z db 3306; do
        echo 'Waiting for MySQL...'
        sleep 2
      done
      python manage.py migrate && python manage.py runserver 0.0.0.0:8000
    "

前提:确保Python镜像中安装了netcat,可以在Dockerfile中添加:

RUN apt-get update && apt-get install -y netcat-traditional && rm -rf /var/lib/apt/lists/*

4. 兼容MySQL 8认证插件(可选)

MySQL 8默认使用caching_sha2_password认证插件,部分Python MySQL客户端可能不兼容,可在db服务中强制使用旧插件:

db:
  command: --default-authentication-plugin=mysql_native_password

5. 优化Dockerfile(可选)

调整COPY顺序,避免每次代码变更都重新安装依赖,同时移除被docker-compose覆盖的CMD:

FROM python:3.10

ENV PYTHONUNBUFFERED 1

WORKDIR /app

COPY requirements.txt /app/
RUN pip install -r requirements.txt

# 先安装依赖,再复制代码,利用Docker缓存
COPY . /app/

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 08:28:32