Docker 容器中与 Postgres 运行 的 Npgsql 连接超时

Npgsql Connection Timeout with Postgres Running in Docker Container

我正在尝试在 .NET 5 控制台应用程序中使用 Npgsql 连接到我的 Postgres 数据库。 Postgres 数据库 运行 在 Docker 容器中。我已经使用 Azure Data Studio 连接到数据库一段时间了,没有任何问题,所以我有点不确定从这个应用程序连接时我做错了什么。

调用NpgsqlConnection.Open()时,抛出System.Timeout异常。

An unhandled exception of type 'Npgsql.NpgsqlException' occurred in System.Private.CoreLib.dll: 'Exception while connecting' Inner exceptions found, see $exception in variables window for more details. Innermost exception System.TimeoutException : Timeout during connection attempt at Npgsql.NpgsqlConnector.Connect(NpgsqlTimeout timeout)

我已经确认 Docker 容器 运行 我的 Postgres 数据库是 运行 并且我可以从 Azure Data Studio 和 PGAdmin 成功连接和查询它。

这是我的控制台应用程序中的代码。我编辑了连接字符串中的值,并多次检查这些值以确保它们与我在 Azure Data Studio 和 PGAdmin 中用于连接的值相同。我也尝试在连接字符串中包含特定的数据库名称,但结果是相同的 System.Timeout 异常。

我正在使用 Npgsql 版本 5.0.4。

using Dapper;
using Npgsql;

namespace EplStats
{
    class Program
    {
        static void Main(string[] args)
        {
            var connStr = "Host={host};Port=5433;Username={usr};Password={pwd};";
            using (var conn = new NpgsqlConnection(connStr))
            {
                conn.Open();
                var test = conn.Query("select * from epl.teams;");
            }
        }
    }
}

这是我的 docker-compose.yml 用于 Postgres 和 PGAdmin

version: "3.9"

services:
  postgres-db:
    image: postgres:13
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    ports:
      - "5433:5432"
    networks:
      - pg_network
    volumes:
      - db_data:/var/lib/postgresql/data

  pgadmin4:
    image: dpage/pgadmin4
    environment:
      PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL}
      PGADMIN_DEFAULT_PASSWORD: ${POSTGRES_PASSWORD}
    ports:
      - "8088:80"
    networks:
      - pg_network

networks:
  pg_network:
    driver: bridge

volumes:
  db_data:

我觉得我在这里遗漏了一些明显的东西,因为代码相对直接地从控制台应用程序打开连接。

我想到的只有两件事:

docker-compose.yml:

  `POSTGRES_DB: <db_name_here>`

并在 Program.cs 文件中:

    var connStr = "Host={host};Port=5433;Username={usr};Password={pwd};Database=<db_name_here>";

不幸的是,我在这里发现了我的问题,正如我所预料的那样,这是一个非常微不足道的问题。

出于某种原因,Azure Data Studio 删除了我的主机值的第一个字符 UI 以建立连接。

例如,如果主机值 182.62.1.27,Azure Data Studio 会在其表单中显示 82.62.1.27 以填写连接详细信息。

我忽略了 Azure Data Studio 表单 UI 和实际主机 IP 地址之间的差异。一旦我在控制台应用程序的连接字符串中设置了正确的主机,我就能够成功连接到数据库。