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

使用Docker部署Django+MySQL项目遇tg_db数据库不存在问题求助

解决Docker部署Django+MySQL时"找不到tg_db数据库"的问题

我经常碰到开发者遇到这个问题,咱们一步步来排查解决:

1. 先确认MySQL容器是否真的创建了tg_db数据库

你设置了MYSQL_DATABASE=tg_db环境变量,但有时候因为数据卷残留或者容器启动异常,数据库可能没被正确创建。咱们手动验证一下:

# 先列出所有容器,找到MySQL容器的名称或ID
docker ps -a
# 进入MySQL容器的命令行
docker exec -it [你的MySQL容器名/ID] bash
# 登录MySQL(输入你设置的MYSQL_ROOT_PASSWORD)
mysql -u root -p
# 查看当前所有数据库
SHOW DATABASES;

如果输出里没有tg_db,那说明环境变量没生效,大概率是旧数据卷在搞鬼。这时候可以彻底清理数据卷后重启:

# 停止并删除容器及关联的数据卷
docker-compose down -v
# 重新启动所有容器
docker-compose up -d

2. 解决Web容器"抢跑"的问题

MySQL容器启动后,不是立刻就能接受连接的——它需要初始化系统数据库、创建你指定的tg_db,这个过程可能需要几秒到几十秒。而Django容器启动后会立刻尝试连接数据库,这时候MySQL还没准备好,就会报错找不到数据库。有几个靠谱的解决办法:

方法一:用healthcheck让Web容器等MySQL就绪

在你的docker-compose.yml里给MySQL服务加健康检查,让Web容器只在MySQL完全就绪后才启动:

services:
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: your_root_pw
      MYSQL_DATABASE: tg_db
      MYSQL_USER: django_user
      MYSQL_PASSWORD: django_pw
    # 添加健康检查
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}"]
      interval: 3s
      timeout: 3s
      retries: 5
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    depends_on:
      mysql:
        # 只在MySQL健康检查通过后启动
        condition: service_healthy

方法二:给Django加启动重试脚本

写一个简单的shell脚本,让Django反复尝试连接数据库,成功后再启动服务。比如在你的Django项目根目录创建wait-for-db.sh:

#!/bin/bash
# 循环尝试连接数据库,直到成功
until python manage.py inspectdb > /dev/null 2>&1; do
  echo "Waiting for database to be ready..."
  sleep 2
done
# 数据库就绪后启动Django
python manage.py runserver 0.0.0.0:8000

然后给脚本加执行权限:chmod +x wait-for-db.sh,再修改docker-compose.yml里的web服务命令:

web:
  build: .
  command: ./wait-for-db.sh

3. 检查Django的数据库配置是否正确

最后再确认一下settings.py里的数据库配置,一定要和Docker容器的配置对应上:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'tg_db',  # 和MYSQL_DATABASE一致
        'USER': 'django_user',  # 和MYSQL_USER一致
        'PASSWORD': 'django_pw',  # 和MYSQL_PASSWORD一致
        'HOST': 'mysql',  # 这里必须是docker-compose里MySQL服务的名称,不能是localhost
        'PORT': '3306',
    }
}

重点注意HOST是服务名(比如你docker-compose里MySQL服务叫mysql,就写mysql),因为Docker容器之间是通过服务名通信的,写localhost会让Django去连接自己容器里的MySQL,自然找不到。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:00:27