docker 当尝试访问或从数据库中获取数据时,用户的PostgresSQL密码验证失败?

sq1bmfud  于 2023-01-08  发布在  Docker
关注(0)|答案(6)|浏览(238)

我在尝试从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已经启动并正在运行

我错过了什么我不知道是什么。

kjthegm6

kjthegm61#

在容器中运行应用程序时,可能需要更新连接字符串,我假设您无法访问数据库。
除非你已经覆盖了连接字符串,否则你将根据appsettings.json从应用内部引用localhost,并且容器中的localhost是它自己的上下文。
因此,您的连接字符串如下所示。

"Server=localhost;Port=5432;Database=DiscountDb;User Id=admin;Password=admin1234;"

但它可能看起来像这样(Docker Compose的Docker网络将解析名称):

"Server=discountdb;Port=5432;Database=DiscountDb;User Id=admin;Password=admin1234;"

因此,在pgadmin服务下的docker合成文件中,如果还没有环境部分,可以添加它来覆盖连接字符串。

environment:
  - DatabaseSettings:ConnectionString="Server=discountdb;Port=5432;Database=DiscountDb;User Id=admin;Password=admin1234;"

可能应该在超驰中去掉"

cxfofazt

cxfofazt2#

检查您是否有一个PostgreSQL示例运行在您的计算机上,然后停止从服务,它将工作正常lm使用相同的教程,并停止我的本地安装postgressql服务

vmdwslir

vmdwslir3#

看起来您的计算机在5432端口上本地运行了另一个PostgreSQL示例。因此,您正在调用此服务器而不是容器化服务器。另一方面,Portainer在您的Docker-compose网络内运行,并按预期调用容器化服务。您可以尝试在您的Docker-compose文件中设置不同的端口。

rlcwz9us

rlcwz9us4#

我遇到了同样的问题,我花了一个多星期的时间来寻找解决方案。我想我们遵循相同的教程,因为当我读你的代码,这是完全一样的我的一个。嗯,我只是改变了文件“appsettings.json”
“服务器=您的PC名称;端口=5432;数据库=折扣数据库;用户ID=管理员;密码=管理员1234;“
不要使用localhost replace作为你电脑的名称。

o0lyfsai

o0lyfsai5#

我首先在appsettings.json中找到了解决方案,添加服务器名称(可能是postgres数据库容器名称)和Host=localhost:

"DatabaseSettings": {
  "ConnectionString": "Server=discountdb;Port=5432;Host=localhost;Database=DiscountDb;User Id=admin;Password=admin1234;"
 
},

然后你需要检查是否有任何服务器运行端口5432通常如果你有Postgres安装在你的计算机上默认端口是5432,所以你需要停止它.
如果你使用的是windows:

taskkill /PID <port value> /F

然后再次运行应用程序。

olhwl3o2

olhwl3o26#

在我的例子中,我已经从我自己的本地机器上删除了**PostgreSQL Db,因为我建议我在添加本地PostgreSQL Db时配置了另一个密码。我现在使用的是Docker,没有必要使用本地Db。

相关问题