尝试在Docker中更新posgres数据库导致机器拒绝连接

时间:2019-05-28 11:02:09

标签: docker asp.net-core

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

  

System.Net.Sockets.SocketException(10061):无法建立连接,因为目标计算机主动拒绝了它。      在Npgsql.NpgsqlConnector.Connect(NpgsqlTimeout超时)      在Npgsql.NpgsqlConnector.RawOpen(NpgsqlTimeout超时,布尔异步,CancellationToken cancelledToken)      在Npgsql.NpgsqlConnector.Open(NpgsqlTimeout超时,布尔异步,CancellationToken cancelToken)      在Npgsql.NpgsqlConnection。<> c__DisplayClass32_0。 d.MoveNext()   ---从之前引发异常的位置开始的堆栈结束跟踪---      在Npgsql.NpgsqlConnection.Open()      在Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal.NpgsqlDatabaseCreator.Exists()      在Microsoft.EntityFrameworkCore.Migrations.HistoryRepository.Exists()      在Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)      在Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration,String contextType)      在Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action操作)   无法建立连接,因为目标计算机主动拒绝了该连接。

我正在将Docker Toolbox用于低端PC。我用以下命令运行了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);
    }
}

之后,我在启动类中添加了dbContext

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

任何人都可以帮助我,或者建议我可能错过的事情吗?

1 个答案:

答案 0 :(得分:0)

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

我假设您是从docker启动.net核心项目的,如果是这样,则需要遵循belwo步骤来连接两个容器。

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

    "Server=pg;Port=5432;Database=postgres;Username=postgres;Password=password"
    
  2. 在运行

    之类的.net内核时指定--link=pg
    docker run -it -p 8585:80 --link=pg dockerpostgres