我在尝试从postgressql获取数据时遇到了一个问题。我正在使用.NET Core 5.0和postgressql作为我的数据库解决方案的微服务架构。
我正在尝试使用Docker容器来容器化我的应用程序,一切都很好,直到我尝试通过API获取一些数据。
我得到了这种类型的错误:
Npgsql.PostgresException (0x80004005): 28P01: password authentication failed for user "admin"
at Npgsql.NpgsqlConnector.<ReadMessage>g__ReadMessageLong|194_0(NpgsqlConnector connector, Boolean async, DataRowLoadingMode dataRowLoadingMode, Boolean readingNotifications, Boolean isReadingPrependedMessage)
at Npgsql.NpgsqlConnector.AuthenticateMD5(String username, Byte[] salt, Boolean async, CancellationToken cancellationToken)
at Npgsql.NpgsqlConnector.Authenticate(String username, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
at Npgsql.NpgsqlConnector.Open(NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
at Npgsql.ConnectorPool.OpenNewConnector(NpgsqlConnection conn, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
at Npgsql.ConnectorPool.<>c__DisplayClass38_0.<<Rent>g__RentAsync|0>d.MoveNext()
--- End of stack trace from previous location ---
at Npgsql.NpgsqlConnection.<>c__DisplayClass41_0.<<Open>g__OpenAsync|0>d.MoveNext()
--- End of stack trace from previous location ---
at Dapper.SqlMapper.QueryRowAsync[T](IDbConnection cnn, Row row, Type effectiveType, CommandDefinition command) in /_/Dapper/SqlMapper.Async.cs:line 472
从后端的Angular 来看,我尝试按productName获取数据的情况非常简单:
public async Task<Coupon> GetDiscount(string productName)
{
using var connection = new NpgsqlConnection
(_configuration.GetValue<string>("DatabaseSettings:ConnectionString"));
var coupon = await connection.QueryFirstOrDefaultAsync<Coupon>
("SELECT * FROM Coupon WHERE ProductName = @ProductName", new { ProductName = productName });
if (coupon == null)
return new Coupon
{ ProductName = "No Discount", Amount = 0, Description = "No Discount Desc" };
return coupon;
}
我的appsettings.json文件,或者更准确地说是指向postgressql的连接字符串是这样的:
"DatabaseSettings": {
"ConnectionString": "Server=localhost;Port=5432;Database=DiscountDb;User Id=admin;Password=admin1234;"
},
在Docker撰写覆盖yml文件中,我有:
discountdb:
container_name: discountdb
environment:
- POSTGRES_USER=admin
- POSTGRES_PASSWORD=admin1234
- POSTGRES_DB=DiscountDb
restart: always
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data/
正如我所看到的,在我的portainer中,我可以看到discountdb已经启动并正在运行
我错过了什么我不知道是什么。
6条答案
按热度按时间kjthegm61#
在容器中运行应用程序时,可能需要更新连接字符串,我假设您无法访问数据库。
除非你已经覆盖了连接字符串,否则你将根据
appsettings.json
从应用内部引用localhost,并且容器中的localhost是它自己的上下文。因此,您的连接字符串如下所示。
但它可能看起来像这样(Docker Compose的Docker网络将解析名称):
因此,在
pgadmin
服务下的docker合成文件中,如果还没有环境部分,可以添加它来覆盖连接字符串。可能应该在超驰中去掉
"
。cxfofazt2#
检查您是否有一个PostgreSQL示例运行在您的计算机上,然后停止从服务,它将工作正常lm使用相同的教程,并停止我的本地安装postgressql服务
vmdwslir3#
看起来您的计算机在5432端口上本地运行了另一个PostgreSQL示例。因此,您正在调用此服务器而不是容器化服务器。另一方面,Portainer在您的Docker-compose网络内运行,并按预期调用容器化服务。您可以尝试在您的Docker-compose文件中设置不同的端口。
rlcwz9us4#
我遇到了同样的问题,我花了一个多星期的时间来寻找解决方案。我想我们遵循相同的教程,因为当我读你的代码,这是完全一样的我的一个。嗯,我只是改变了文件“appsettings.json”
“服务器=您的PC名称;端口=5432;数据库=折扣数据库;用户ID=管理员;密码=管理员1234;“
不要使用localhost replace作为你电脑的名称。
o0lyfsai5#
我首先在appsettings.json中找到了解决方案,添加服务器名称(可能是postgres数据库容器名称)和Host=localhost:
然后你需要检查是否有任何服务器运行端口5432通常如果你有Postgres安装在你的计算机上默认端口是5432,所以你需要停止它.
如果你使用的是windows:
然后再次运行应用程序。
olhwl3o26#
在我的例子中,我已经从我自己的本地机器上删除了**PostgreSQL Db,因为我建议我在添加本地PostgreSQL Db时配置了另一个密码。我现在使用的是Docker,没有必要使用本地Db。