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

GCP部署Okuna API执行migrate报MySQL连接2003错误排查

问题根因

报错核心是执行命令的环境与配置不匹配,和Django业务逻辑无关:

  • 直接在GCP虚拟机宿主机执行python3.8 manage.py migrate时,Django默认读取宿主机当前目录下的.env配置,指向127.0.0.1:3307的数据库地址,但MariaDB实际运行在Docker容器内,并未监听宿主机的3307端口,直接触发连接拒绝错误。
  • 现有docker-compose配置中,db服务的端口仅写了- 3306,属于将容器3306端口随机映射到宿主机临时高端口,没有固定绑定到宿主机3307端口,宿主机无法通过127.0.0.1直接访问容器内的数据库。
  • 容器内的webserver、worker、scheduler服务加载的是.docker-compose.env配置,走Docker内部专有网络通过db.okuna:3306访问数据库是正常的,所以之前能通过GCP外部IP正常访问Django服务,但宿主机直接执行命令时使用的是宿主机的环境变量和网络栈,和容器内部环境完全隔离。
解决方案

二选一即可,优先选第一种,符合容器化部署的操作规范,不需要改任何现有配置。

方案1:进入webserver容器内部执行migrate(推荐)

容器化部署下所有Django管理命令都应进入对应容器执行,不要直接在宿主机跑python命令:

  1. 先确认所有Docker服务正常运行:
    docker-compose -f docker-compose-full.yml ps
    
    确认db、webserver等服务状态均为Up后再继续操作。
  2. 进入okuna-api容器执行数据库迁移命令:
    docker exec -it okuna-api python3.8 manage.py migrate
    
    容器内部已经自动加载.docker-compose.env配置,走Docker内部网络直连数据库,不需要额外做端口映射即可连通。
    后续所有Django管理操作(比如创建超级管理员、收集静态文件)都用这种docker exec进容器的方式执行,不会再出现环境变量、网络不匹配的问题。

方案2:调整端口映射支持宿主机直连执行命令

如果确实需要在宿主机直接执行manage.py命令,按以下步骤调整配置:

  1. 修改docker-compose-full.yml中db服务的端口映射规则,将容器3306端口固定绑定到宿主机3307端口,和.env中的配置对应:
    db:
      image: mariadb:10.4.5
      hostname: db.okuna
      volumes:
        - mariadb:/var/lib/mysql
      ports:
        - "127.0.0.1:3307:3306"
      # 其余原有配置保持不变
    
    如果宿主机也需要直连Redis,同步把redis服务的端口配置改成"127.0.0.1:6380:6379",和.env中的Redis配置匹配。注意必须绑定127.0.0.1,不要绑定0.0.0.0,避免数据库、Redis暴露在公网被攻击。
  2. 重启db服务让端口映射生效:
    docker-compose -f docker-compose-full.yml up -d db
    
  3. 确认宿主机3307端口可正常连通后,再在宿主机执行python3.8 manage.py migrate即可。
补充校验点

操作前确认.env和.docker-compose.env中配置的RDS_PASSWORD值和MariaDB实际设置的密码一致,避免连通端口后出现密码认证失败的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 23:39:29