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

使用Docker Compose时ASP.Net Core API无法连接PostgreSQL求助

问题分析与解决方案

从错误信息Failed to connect to [::1]:5432可以看出,你的API容器并未使用配置的Server=db连接数据库,而是尝试访问本地IPv6地址([::1]即localhost),核心原因是API没有正确读取到Docker Compose中设置的环境变量连接字符串。

核心修复步骤

1. 修正环境变量命名格式

ASP.NET Core中,环境变量的层级结构需要用**双下划线__**分隔,对应配置文件中的冒号:。你当前使用的单下划线ConnectionStrings_Default无法正确映射到配置里的ConnectionStrings:Default,需修改为:

environment:
  ASPNETCORE_ENVIRONMENT: Development
  ConnectionStrings__Default: Server=db;Port=5432;Database=DB;User Id=postgres;Password=MyPassword123;

2. 确认API配置读取逻辑

确保API启动时优先读取环境变量。默认情况下ASP.NET Core已支持环境变量覆盖配置文件,也可在Program.cs中显式确认:

var builder = WebApplication.CreateBuilder(args);

// 显式添加环境变量配置源(默认已包含,添加后逻辑更清晰)
builder.Configuration.AddEnvironmentVariables();

// 正确读取连接字符串并注入DbContext
var connectionString = builder.Configuration.GetConnectionString("Default");
builder.Services.AddDbContext<YourDbContext>(options =>
    options.UseNpgsql(connectionString));

3. 确保目标数据库存在

你的连接字符串指定了Database=DB,但PostgreSQL默认只会创建与用户名同名的数据库(此处为postgres),不会自动生成DB库。可通过以下方式解决:

  • 在db服务的环境变量中添加POSTGRES_DB: DB,让容器启动时自动创建该数据库:
    db:
      image: postgres:15.1-alpine
      container_name: db
      restart: always
      environment:
        POSTGRES_USER: postgres
        POSTGRES_PASSWORD: "MyPassword123"
        POSTGRES_DB: DB  # 添加该行自动创建目标库
    
  • 或手动进入db容器,通过SQL命令创建DB数据库。

额外说明

  • 无需自定义桥接网络:Docker Compose默认会为所有服务创建专属桥接网络,服务间可直接通过服务名(如db)通信,当前网络配置无问题。
  • depends_on仅保证容器启动顺序:若后续遇到数据库未就绪导致的连接失败,可为db服务添加健康检查,让API等待数据库完全就绪后再启动:
    db:
      # ... 其他配置
      healthcheck:
        test: ["CMD-SHELL", "pg_isready -U postgres -d DB"]
        interval: 5s
        timeout: 5s
        retries: 5
    api:
      # ... 其他配置
      depends_on:
        db:
          condition: service_healthy
    

内容的提问来源于stack exchange,提问作者R.Haughton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 15:55:24