如何使用 Docker Compose 将 ASP.NET Core Web API 连接到 PostgreSQL 数据库?

问题描述 投票:0回答:1

我正在尝试让我的应用程序与 Docker Compose 配合使用,但每次运行

docker-compose up -d
时,我的 API 都会在启动时崩溃(我正在尝试使用 EF Core 迁移我的数据库,以防我不在生产环境中)。

我收到此错误:

2024-05-15 17:24:18 Unhandled exception. Npgsql.NpgsqlException (0x80004005): Failed to connect to 192.168.208.2:5432
2024-05-15 17:24:18  ---> System.Net.Sockets.SocketException (111): Connection refused
2024-05-15 17:24:18    at Npgsql.Internal.NpgsqlConnector.Connect(NpgsqlTimeout timeout)
2024-05-15 17:24:18    at Npgsql.Internal.NpgsqlConnector.Connect(NpgsqlTimeout timeout)
2024-05-15 17:24:18    at Npgsql.Internal.NpgsqlConnector.RawOpen(SslMode sslMode, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken, Boolean isFirstAttempt)
2024-05-15 17:24:18    at Npgsql.Internal.NpgsqlConnector.<Open>g__OpenCore|213_1(NpgsqlConnector conn, SslMode sslMode, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken, Boolean isFirstAttempt)
2024-05-15 17:24:18    at Npgsql.Internal.NpgsqlConnector.Open(NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
2024-05-15 17:24:18    at Npgsql.UnpooledDataSource.Get(NpgsqlConnection conn, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
2024-05-15 17:24:18    at Npgsql.NpgsqlConnection.<Open>g__OpenAsync|42_0(Boolean async, CancellationToken cancellationToken)
2024-05-15 17:24:18    at Npgsql.NpgsqlConnection.Open()
2024-05-15 17:24:18    at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnection(Boolean errorsExpected)
2024-05-15 17:24:18    at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenInternal(Boolean errorsExpected)
2024-05-15 17:24:18    at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open(Boolean errorsExpected)
2024-05-15 17:24:18    at Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal.NpgsqlDatabaseCreator.Exists(Boolean async, CancellationToken cancellationToken)
2024-05-15 17:24:18    at Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal.NpgsqlDatabaseCreator.Exists(Boolean async, CancellationToken cancellationToken)
2024-05-15 17:24:18    at Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal.NpgsqlDatabaseCreator.Exists()
2024-05-15 17:24:18    at Microsoft.EntityFrameworkCore.Migrations.HistoryRepository.Exists()
2024-05-15 17:24:18    at Microsoft.EntityFrameworkCore.Migrations.HistoryRepository.GetAppliedMigrations()
2024-05-15 17:24:18    at Npgsql.EntityFrameworkCore.PostgreSQL.Migrations.Internal.NpgsqlMigrator.Migrate(String targetMigration)
2024-05-15 17:24:18    at Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.Migrate(DatabaseFacade databaseFacade)
2024-05-15 17:24:18    at Program.<Main>$(String[] args) in /src/QuizyZunaAPI.Api/Program.cs:line 31

这是我的 Docker Compose:

version: '3.4'

services:
  quizyzuna-db:
    container_name: Database
    image: postgres:alpine
    restart: always
    environment:
      - POSTGRES_DB=quizyzunadb
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    volumes:
      - ./.containers/database:/var/lib/postgressql/data
    ports:
      - 5432:5432

  quizyzuna-api:
    container_name: API
    image: ${DOCKER_REGISTRY-}quizyzunaapi
    build:
      context: src/
    depends_on:
        - quizyzuna-db

以及 docker compose 覆盖:

version: '3.4'

services:
  quizyzuna-api:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_HTTP_PORTS=8080
      - ASPNETCORE_HTTPS_PORTS=8081
      - ConnectionStrings__Database=Host=Database;Username=postgres;Password=postgres;Database=quizyzunadb;
    ports:
      - "8080"
      - "8081"
    volumes:
      - ${APPDATA}/Microsoft/UserSecrets:/home/app/.microsoft/usersecrets:ro
      - ${APPDATA}/ASP.NET/Https:/home/app/.aspnet/https:ro

在我的作文中,我尝试删除我的连接字符串,以给它 docker 构建的字符串,看起来?就像它有效一样。

我可以通过我的本地主机与数据库上的 DBeaver 连接。

我试图寻找常见错误,但大多数都是开发人员在环境中编写 localhost 作为主机。

我的连接字符串似乎没问题,并且连接字符串似乎已正确替换,但我不知道要搜索什么。你有线索吗?

postgresql docker docker-compose asp.net-core-webapi npgsql
1个回答
0
投票

您的 quizyzuna-api 是否在其连接字符串中使用了正确的主机。 尝试将连接字符串中的主机设置为 quizyzuna-db

此外,您的日志表明该 api 正在尝试连接到 192.168.208.2。您可以使用 docker inform 查看 postgres 容器的 IP 地址来验证是否为 192.168.208.2

© www.soinside.com 2019 - 2024. All rights reserved.