Postgres connection issue EF Core / docker-compose up

0

I have a docker compose file, I have a postgres instance being brough up, and a web api project also, however I am getting the following error:

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

Here is my 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"    

Here is my connection string:

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

If I run the postgres as it's own image, and connect via it's local address I am able to connect, my migrations run, no problems whatsoever.

The only time I get the error is via the docker-compose.

Additionally, I am unable to connect to the rabbitmq instance via localhost:15672, any suggestions on that would be great too...

Any ideas where the problem is?

postgresql
docker
asp.net-core
entity-framework-core
asked on Stack Overflow May 10, 2020 by ThrowawayJs

1 Answer

0

you can't use the localhost while communicating with containers. because in the container has it's own loopback address. therefore you need to use a service name, container name, or host IP address.

if IP address = 10.10.10.1

you can connect to your Postgres using

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

in your container, you can use Server=db

answered on Stack Overflow May 10, 2020 by damith udayanga

User contributions licensed under CC BY-SA 3.0