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 地址之间的差异。一旦我在控制台应用程序的连接字符串中设置了正确的主机,我就能够成功连接到数据库。
我正在尝试在 .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 地址之间的差异。一旦我在控制台应用程序的连接字符串中设置了正确的主机,我就能够成功连接到数据库。