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

ECS中Postgres与Django容器无法通信问题排查求助

ECS Fargate中Django容器无法连接同任务内Postgres容器的解决方案

问题背景

在AWS ECS Fargate部署测试环境,使用同一任务定义内的Postgres容器与Django容器。Postgres日志显示已准备好接受连接,但Django的wait-for-it.sh脚本始终无法建立TCP连接。已确认镜像多架构适配正常,安全组开放5432/8000端口,修改DB_HOST为localhost后问题依旧。

核心问题分析与解决步骤

1. 明确Fargate任务内容器的网络特性

在awsvpc网络模式下,同一ECS任务内的所有容器共享同一个网络命名空间:

  • 容器间需通过localhost访问彼此端口,而非容器名称(Fargate任务内无内置DNS解析容器名称)
  • 无需配置端口映射的hostPort,避免端口冲突

2. 修正DB_HOST与脚本参数传递

  • 将Django容器的DB_HOST从db改为localhost
  • 调整wait-for-it.sh的调用方式,拆分host和port参数(原调用db:5432会导致脚本解析错误)

修改任务定义中web容器的环境变量与启动命令:

{
  "environment": [
    { "name": "DB_HOST", "value": "localhost" }
  ],
  "command": [
    "sh", "-c",
    "echo 'Waiting for DB to be ready...' && /usr/local/bin/wait-for-it.sh localhost 5432 -- echo 'DB is ready, starting application...' && python manage.py makemigrations && python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
  ]
}

3. 添加容器启动依赖(可选)

通过dependsOn明确容器启动顺序,确保Postgres先启动完成:

{
  "name": "web",
  "dependsOn": [
    {
      "containerName": "db",
      "condition": "START"
    }
  ]
}

4. 调试网络连通性(临时方法)

在Django容器启动命令中添加调试步骤,确认网络状态:

sh -c "echo 'Testing localhost:5432...' && nc -zv localhost 5432 && cat /etc/hosts && /usr/local/bin/wait-for-it.sh localhost 5432 -- echo 'DB ready' && python manage.py migrate..."

修正后的任务定义关键片段

{
  "family": "kanastra-task",
  "networkMode": "awsvpc",
  "containerDefinitions": [
    {
      "name": "db",
      "image": "postgres",
      "essential": true,
      "memory": 512,
      "cpu": 256,
      "environment": [
        { "name": "POSTGRES_DB", "value": "kanastra_db" },
        { "name": "POSTGRES_USER", "value": "kanastra_user" },
        { "name": "POSTGRES_PASSWORD", "value": "mypassword" }
      ],
      "portMappings": [
        { "containerPort": 5432, "protocol": "tcp" }
      ]
    },
    {
      "name": "web",
      "image": "${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ secrets.AWS_REGION }}.amazonaws.com/backend:latest",
      "essential": true,
      "memory": 512,
      "cpu": 256,
      "environment": [
        { "name": "DB_NAME", "value": "kanastra_db" },
        { "name": "DB_USER", "value": "kanastra_user" },
        { "name": "DB_PASSWORD", "value": "mypassword" },
        { "name": "DB_HOST", "value": "localhost" },
        { "name": "DB_PORT", "value": "5432" }
      ],
      "dependsOn": [
        {
          "containerName": "db",
          "condition": "START"
        }
      ],
      "command": [
        "sh", "-c",
        "echo 'Waiting for DB to be ready...' && /usr/local/bin/wait-for-it.sh localhost 5432 -- echo 'DB is ready, starting application...' && python manage.py makemigrations && python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
      ]
    }
  ]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 01:35:55