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

AWS PostgreSQL RDS实例与Docker-Compose部署的Django容器连接失败:数据库不存在问题求助

解决Docker部署的Django容器无法连接AWS RDS的问题

从你给出的报错信息来看,核心问题非常明确:你的Django应用在尝试连接一个名为db-PROJECT_NAME-ec2的数据库,但这个数据库在你的AWS RDS实例中并不存在。下面是一步步的排查和解决步骤:

1. 验证环境变量的准确性

首先检查你的envs/.env.prod文件,确认SQL_DATABASE的值是不是你在AWS RDS上计划使用的数据库名称,而不是本地测试时自动生成的db-PROJECT_NAME-ec2。

你可以直接在运行中的Web容器里打印环境变量来验证:

docker exec <你的web容器名称> printenv SQL_DATABASE

如果输出的是db-PROJECT_NAME-ec2,那说明环境变量配置有误,需要修改.env.prod里的SQL_DATABASE为你RDS上的目标数据库名。

2. 在AWS RDS上创建目标数据库

AWS RDS在创建PostgreSQL实例时,只会自动创建一个默认的postgres数据库,不会帮你创建业务数据库。你需要手动创建:

  • 登录AWS控制台,进入你的RDS实例详情页,打开查询编辑器,用超级用户(通常是你创建实例时设置的主用户名)登录。
  • 执行创建数据库的SQL命令:
CREATE DATABASE <你的目标数据库名>;

创建完成后,执行\l命令可以查看所有数据库,确认新库已存在。

3. 检查entrypoint脚本的干扰

从报错日志里的Waiting for postgres... PostgreSQL started可以看出,你的entrypoint.prod.sh脚本里有等待PostgreSQL的逻辑。但生产环境你用的是RDS,不是本地容器数据库,需要确认这个脚本的逻辑是否正确:

  • 脚本是不是在等待本地postgres容器的主机名(比如db),而不是RDS的SQL_HOST?如果是,这个等待逻辑会失效,甚至可能导致环境变量没有正确加载。
  • 脚本里有没有硬编码数据库名称的代码?比如有没有覆盖SQL_DATABASE环境变量的逻辑?

建议修改entrypoint脚本,让它基于SQL_HOST和SQL_PORT来检测RDS的连通性,而不是本地容器。

4. 验证RDS的网络和权限配置(提前排除后续问题)

虽然当前报错是数据库不存在,但也要确保后续连接不会遇到网络或权限问题:

  • 安全组配置:确认RDS实例的安全组允许你的Docker容器所在服务器(EC2/ECS节点)的IP访问5432端口(PostgreSQL默认端口)。
  • 用户权限:确保你的SQL_USER拥有目标数据库的访问权限,以及执行migrate所需的权限。可以在RDS查询编辑器中执行:
GRANT ALL PRIVILEGES ON DATABASE <你的目标数据库名> TO <你的SQL_USER>;

5. 测试连接

完成上述步骤后,重启你的Web容器,或者直接在容器内手动执行migrate命令测试:

docker exec <你的web容器名称> python manage.py migrate

如果没有报错,说明连接成功了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 14:07:32