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
相关产品推荐
相关产品推荐

