首页 > 解决方案 > 尝试在 docker 中更新 posgres 数据库导致机器拒绝连接

问题描述

在进行第一次数据库更新时出现错误

System.Net.Sockets.SocketException (10061):无法建立连接,因为目标机器主动拒绝了它。在 Npgsql.NpgsqlConnector.Connect(NpgsqlTimeout timeout) 在 Npgsql.NpgsqlConnector.RawOpen(NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken) 在 Npgsql.NpgsqlConnector.Open(NpgsqlTimeout timeout, Boolean async, CancellationToken cancelToken) 在 Npgsql.NpgsqlConnection.<>c__DisplayClass32_0 .<g__OpenLong|0>d.MoveNext() --- 从先前引发异常的位置结束堆栈跟踪 --- 在 Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal.NpgsqlDatabaseCreator.Exists 的 Npgsql.NpgsqlConnection.Open() () 在 Microsoft.EntityFrameworkCore.Migrations.HistoryRepository.Exists() 在 Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator。

我正在为低端电脑使用 Docker Toolbox。我用命令运行了 postgres 容器:

docker run --name pg -e POSTGRES_PASSWORD=password -p 5432:5432 -d postgres;

为了将 EF Core 连接到 pgsql,我使用了 Npgsql nuget 包和 connectionString

"Server=127.0.0.1;Port=5432;Database=postgres;Username=postgres;Password=password"

接下来,我在 MyDbContext 文件中创建

public class MyDbContext : DbContext
{
    public MyDbContext(DbContextOptions<MyDbContext> options) : base(options) { }
}


public class MyDbContextFactory : IDesignTimeDbContextFactory<MyDbContext>
{
    public MyDbContext CreateDbContext(string[] args)
    {
        var optionsBuilder = new DbContextOptionsBuilder<MyDbContext>();
        optionsBuilder.UseNpgsql("Server=127.0.0.1;Port=5432;Database=postgres;Username=postgres;Password=password");

        return new MyDbContext(optionsBuilder.Options);
    }
}

之后我在 Startup 类中添加了 dbContext

public void ConfigureServices(IServiceCollection services, IConfiguration config)
{
    services.AddDbContext<Models.MyDbContext>();

谁能帮助我,或者建议我错过了什么?

标签: dockerasp.net-core

解决方案


对于您的方案,Server=127.0.0.1当您从主机启动 .net 核心项目时将起作用。

我假设您从 docker 启动您的 .net 核心项目,如果是这样,您需要按照以下步骤连接两个容器。

  1. 使用 postgres 容器名称更改您的连接字符串pg,例如

    "Server=pg;Port=5432;Database=postgres;Username=postgres;Password=password"
    
  2. 指定--link=pg运行 .net 核心的时间,例如

    docker run -it -p 8585:80 --link=pg dockerpostgres
    

推荐阅读