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

Docker+Django+MySQL环境中Django无法连接MySQL的问题求助

问题分析与修复方案

1. Django无法连接MySQL的问题

核心原因

  • 环境变量中数据库端口错误:MYSQL_DATABASE_PORT=33061是宿主机映射端口,容器内部访问mysql_db服务需用容器原生的3306端口
  • depends_on仅等待容器启动,不等待MySQL服务完全就绪

修复步骤

(1)修正环境变量

修改env.dev中的数据库端口:

MYSQL_DATABASE_PORT=3306

(2)添加服务就绪等待逻辑

给backend服务添加启动前等待MySQL就绪的脚本,同时修正expose端口的笔误(原配置写为800,实际应为8000):
修改docker-compose.yaml的backend部分:

backend:
  build:
    context: .
    dockerfile: docker/django/Dockerfile
  env_file: env.dev
  restart: on-failure
  depends_on:
    - mysql_db
  working_dir: "/app/autopark"
  expose:
    - 8000
  ports:
    - "8001:8000"
  command: ["/bin/bash", "-c", "until nc -z mysql_db 3306; do echo waiting for mysql; sleep 2; done; python3 manage.py runserver 0.0.0.0:8000"]
  networks:
    - autopark_network

(3)在backend镜像中安装netcat

修改docker/django/Dockerfile,添加netcat依赖:

FROM ubuntu:22.04
MAINTAINER Pavel Vasilev <pvlvslv@yandex.ru>

RUN apt -y update
RUN apt -y install python3-dev python3-pip gdal-bin gdal-data netcat-traditional

WORKDIR /app/autopark
ADD . /app/autopark

RUN pip install -r requirements.txt

2. MySQL初始化报错No database selected

核心原因

初始化脚本未提前创建/切换到目标数据库,且mysqldump导出的sql文件默认不包含CREATE DATABASE和USE语句

修复步骤

修改init_db.sh,确保先创建数据库(如果不存在)并切换,同时适配MySQL 8.0的权限规则:

#!/bin/bash

mysql -u root --password="$MYSQL_ROOT_PASSWORD" << EOF
CREATE DATABASE IF NOT EXISTS ${MYSQL_DATABASE};
USE ${MYSQL_DATABASE};
SOURCE /usr/local/init_db.sql;
GRANT ALL PRIVILEGES ON ${MYSQL_DATABASE}.* TO '${MYSQL_USER}'@'%';
FLUSH PRIVILEGES;
EOF

3. MySQL启动失败提示socket被占用

核心原因

初始化脚本执行出错,导致临时启动的mysqld进程未正常退出,后续启动时端口被占用

修复步骤

上述初始化脚本修复后,该问题会自动解决。执行以下命令重置环境,确保初始化流程重新执行:

docker-compose down -v
docker-compose build
docker-compose up

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 06:17:06