@roflanPominki

Из-за чего может быть ошибка к подключению к серверу tcp://localhost:5432?

У меня есть Dockerfile:
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
USER app
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["Example.csproj", "./"]
RUN dotnet restore "Example.csproj"
COPY . .
WORKDIR "/src/"
RUN dotnet build "Example.csproj" -c $BUILD_CONFIGURATION -o /app/build

FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "Example.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Example.dll"]

И есть docker-compose:
version: "3.9"

networks:
  app-dev:
    driver: bridge

services:
  app:
    container_name: app
    links:
      - db
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      - ASPNETCORE_URLS=http://+
    ports:
      - "8080:80"
    networks: 
      - app-dev
    depends_on: 
      - db
  db:
    container_name: postgres-db
    image: postgres:latest
    restart: always
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: example
    ports:
      - "5432:5432"
    networks: 
      - app-dev
    volumes:
      - postgres-data:/var/lib/postgresql/data

volumes: 
  postgres-data:

Я запускаю docker compose up, все запускается без ошибок. Приложение работает до тех пор пока я не попытаюсь обратиться к эндпоинту который берет данные с бд получаю ошибку

fail: Microsoft.EntityFrameworkCore.Database.Connection[20004]
app | An error occurred using the connection to database 'example' on server 'tcp://localhost:5432'.
app | fail: Microsoft.EntityFrameworkCore.Update[10000]
app | An exception occurred in the database while saving changes for context type 'Example.Data.AppDbContext'.
app | System.InvalidOperationException: An exception has been raised that is likely due to a transient failure.

Сама бд успешно создалась и к ней можно подключится, так же строка подключения, по всей видимости, без ошибок(т.к. если запустить контейнер только с postgresql и запустить приложение через dotnet run ошибок не будет)
"ConnectionStrings": {
    "DefaultConnection": "User ID=postgres;Password=postgres;Host=localhost;Port=5432;Database=example;"
  }
  • Вопрос задан
  • 316 просмотров
Решения вопроса 1
docker compose при выполнении команды up создаёт между сервисами новую сеть по умолчанию.
Каждому сервису в этой сети он назначает имя хоста, соответствующее имени самого сервиса и в сети по умолчанию, и в вашей кастомной сети app-dev. Вместо localhost ставим db.

"ConnectionStrings": {
    "DefaultConnection": "User ID=postgres;Password=postgres;Host=db;Port=5432;Database=example;"
  }


А вот снаружи сети докера, т.е. с вашей локальной машины из какого-то другого приложения вы сможете получить доступ уже через localhost (если у вас не Mac)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Drno
Потому что бд нет по адресу 127.0.0.1. Этож локалхост…
Если это app обращается, то она обращается сама к себе
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы