postgresql - 尝试访问数据库或从数据库获取数据时,用户的 PostgresQL 密码身份

我在尝试从 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

从后端的角度来看,我尝试通过产品名称获取数据的情况非常简单:

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 compose override 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 已启动并正在运行

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

最佳答案

在容器中运行应用程序时,您可能需要更新连接字符串。我假设您无法访问数据库。

您正在根据 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 compose 文件中,您可以添加一个环境部分(如果您还没有),以覆盖连接字符串。

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

覆盖中可能应该没有 "

关于postgresql - 尝试访问数据库或从数据库获取数据时,用户的 PostgresQL 密码身份验证失败的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67106691/

相关文章:

javascript - jQuery 获取所有 值的数组

r - 有条件地替换 R 中的值

awk - 拆分但保留分隔符很少

unix - Linux : How to AWK to find maximums in ever

design-patterns - 使用字符串与枚举作为工厂方法的参数?

c++ - 为什么 sizeof 运算符对数组产生不同的结果

string - 为什么 String::from(&str) 和 &str.to_string()

scala - 在范围内显示时未找到隐式

python - 避免嵌套 .apply()

r - 在 R 中的特定值之后将每行的值设置为 NA