【问题标题】:Postgres connection issue EF Core / docker-compose upPostgres 连接问题 EF Core / docker-compose up
【发布时间】:2020-08-26 01:57:17
【问题描述】:

我有一个 docker compose 文件,我有一个 postgres 实例正在启动,还有一个 web api 项目,但是我收到以下错误:

api_1       |       Application startup exception
api_1       | Npgsql.NpgsqlException (0x80004005): Exception while connecting
api_1       |  ---> System.TimeoutException: Timeout during connection attempt
api_1       |    at Npgsql.NpgsqlConnector.Connect(NpgsqlTimeout timeout)
api_1       |    at Npgsql.NpgsqlConnector.Connect(NpgsqlTimeout timeout)
api_1       |    at Npgsql.NpgsqlConnector.RawOpen(NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
api_1       |    at Npgsql.NpgsqlConnector.Open(NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
api_1       |    at Npgsql.NpgsqlConnection.<>c__DisplayClass32_0.<<Open>g__OpenLong|0>d.MoveNext()
api_1       | --- End of stack trace from previous location where exception was thrown ---
api_1       |    at Npgsql.NpgsqlConnection.Open()
api_1       |    at Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal.NpgsqlDatabaseCreator.Exists()
api_1       |    at Microsoft.EntityFrameworkCore.Migrations.HistoryRepository.Exists()
api_1       |    at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
api_1       |    at Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.Migrate(DatabaseFacade databaseFacade)
api_1       |    at my.Claims.Engine.Api.Startup.Configure(IApplicationBuilder app, IWebHostEnvironment env, myDbContext ctx) in /src/my.Claims.Engine.Api/Startup.cs:line 56
api_1       |    at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
api_1       |    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
api_1       |    at Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(Object instance, IApplicationBuilder builder)
api_1       |    at Microsoft.AspNetCore.Hosting.ConfigureBuilder.<>c__DisplayClass4_0.<Build>b__0(IApplicationBuilder builder)
api_1       |    at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass13_0.<UseStartup>b__2(IApplicationBuilder app)
api_1       |    at Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter.<>c__DisplayClass0_0.<Configure>g__MiddlewareFilterBuilder|0(IApplicationBuilder builder)
api_1       |    at Microsoft.AspNetCore.HostFilteringStartupFilter.<>c__DisplayClass0_0.<Configure>b__0(IApplicationBuilder app)
api_1       |    at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken)
api_1       | Unhandled exception. Npgsql.NpgsqlException (0x80004005): Exception while connecting
api_1       |  ---> System.TimeoutException: Timeout during connection attempt
api_1       |    at Npgsql.NpgsqlConnector.Connect(NpgsqlTimeout timeout)
api_1       |    at Npgsql.NpgsqlConnector.Connect(NpgsqlTimeout timeout)
api_1       |    at Npgsql.NpgsqlConnector.RawOpen(NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
api_1       |    at Npgsql.NpgsqlConnector.Open(NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
api_1       |    at Npgsql.NpgsqlConnection.<>c__DisplayClass32_0.<<Open>g__OpenLong|0>d.MoveNext()
api_1       | --- End of stack trace from previous location where exception was thrown ---
api_1       |    at Npgsql.NpgsqlConnection.Open()
api_1       |    at Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal.NpgsqlDatabaseCreator.Exists()
api_1       |    at Microsoft.EntityFrameworkCore.Migrations.HistoryRepository.Exists()
api_1       |    at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
api_1       |    at Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.Migrate(DatabaseFacade databaseFacade)
api_1       |    at my.Claims.Engine.Api.Startup.Configure(IApplicationBuilder app, IWebHostEnvironment env, myDbContext ctx) in /src/my.Claims.Engine.Api/Startup.cs:line 56
api_1       |    at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
api_1       |    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
api_1       |    at Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(Object instance, IApplicationBuilder builder)
api_1       |    at Microsoft.AspNetCore.Hosting.ConfigureBuilder.<>c__DisplayClass4_0.<Build>b__0(IApplicationBuilder builder)
api_1       |    at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass13_0.<UseStartup>b__2(IApplicationBuilder app)
api_1       |    at Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter.<>c__DisplayClass0_0.<Configure>g__MiddlewareFilterBuilder|0(IApplicationBuilder builder)
api_1       |    at Microsoft.AspNetCore.HostFilteringStartupFilter.<>c__DisplayClass0_0.<Configure>b__0(IApplicationBuilder app)
api_1       |    at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken)
api_1       |    at Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancellationToken)
api_1       |    at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token)
api_1       |    at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token)
api_1       |    at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.Run(IHost host)
api_1       |    at my.Claims.Engine.Api.Program.Main(String[] args) in /src/my.Claims.Engine.Api/Program.cs:line 17
my-claims_api_1 exited with code 139

这是我的 docker-compose:


services: 
    db:
        image: postgres
        restart: always
        ports:
            - '5432:5432'
        environment:
            POSTGRES_USER: root
            POSTGRES_PASSWORD: password
    eventbus:
        image: 'rabbitmq'
        ports:
            - '5672:5672'
            - '15672:15672'
    portal:
        image: ${DOCKER_REGISTRY-}portal
        build:
            context: ./portal
            dockerfile: Docker/Dockerfile
        ports: 
            - "3000:80"
    api:
        image: ${DOCKER_REGISTRY-}my_claims_engine_api
        build:
            context: ./my.Claims.Engine
            dockerfile: my.Claims.Engine.Api/Dockerfile
        ports: 
            - "4000:80"    

这是我的连接字符串:

"myDbContext": "Server=localhost;Port=5432;Database=mydatabase;User Id=root;Password=password;"

如果我将 postgres 作为它自己的映像运行,并通过我能够连接的本地地址进行连接,我的迁移就会运行,没有任何问题。

我唯一一次得到错误是通过 docker-compose。

另外,我无法通过 localhost:15672 连接到 rabbitmq 实例,任何关于此的建议也很棒......

有什么想法吗?

【问题讨论】:

    标签: postgresql docker asp.net-core entity-framework-core


    【解决方案1】:

    在与容器通信时不能使用 localhost。因为在容器中有它自己的环回地址。因此您需要使用服务名称、容器名称或主机 IP 地址。

    如果 IP 地址 = 10.10.10.1

    您可以使用

    连接到您的 Postgres

    "myDbContext":"Server=10.10.10.1;Port=5432;Database=mydatabase;UserId=root;Password=password;"

    在您的容器中,您可以使用Server=db

    【讨论】:

      猜你喜欢
      • 2020-09-08
      • 2019-01-02
      • 1970-01-01
      • 2021-08-15
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      • 1970-01-01
      • 2020-12-18
      相关资源
      最近更新 更多