Почему EFCore не может подключится к SqlServer?

Решил написать простое приложение с помощью ASP.NET Core ; EFCore ; Docker ; SqlServer. Использовал докер-образ базы данных, и использовал в докер-композ файле, а также написал свой докер-образ для собирания приложения ASP.NET Core. Когда начал запускать проект docker-compose up --build, то всё запустилось хорошо, но приложение ASP.NET Core выбросило ошибку, поскольку оно не смогло подключиться к базе данных, ибо он не нашел такой сервер. Имя сервера я явно не знаю и перепробовал те, которые нашел в интернете. Было и db, и localhost, и localhost,1433. Но всё равно он не может найти сервер. Помогите пожалуйста.

Структура проекта:

введите сюда описание изображения

Dockerfile:

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS sdk
WORKDIR /src
COPY MyWebApp.sln .
COPY MyWebApp.Web/MyWebApp.Web.csproj ./MyWebApp.Web/
COPY MyWebApp.DAL/MyWebApp.DAL.csproj ./MyWebApp.DAL/
RUN dotnet restore

COPY MyWebApp.Web/. ./MyWebApp.Web/
COPY MyWebApp.DAL/. ./MyWebApp.DAL/ 
WORKDIR /src/MyWebApp.Web
RUN dotnet publish -c Release -o ./app --no-restore
WORKDIR /src/MyWebApp.DAL
RUN dotnet publish -c Release -o ./app --no-restore

FROM sdk as publish
WORKDIR /src

FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
EXPOSE 8080
ENV ASPNETCORE_HTTP_PORTS=8080
COPY --from=publish /src/MyWebApp.Web/app ./
COPY --from=publish /src/MyWebApp.DAL/app ./
ENTRYPOINT [ "dotnet", "MyWebApp.Web.dll" ]

Подключение из Program.cs из API проекта:

builder.Services.AddDbContext<AppDbContext>(opt =>
{
    Thread.Sleep(15000);
    opt.UseSqlServer("Server=localhost; Database=MyDatabase; User Id=sa; Password=saroot1234A$; TrustServerCertificate=true");
});

Сама ошибка:

Unhandled exception. Microsoft.Data.SqlClient.SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible.

Если нужны подробности, пишите, и/или репозиторий


Ответы (1 шт):

Автор решения: Hikashi

В общем, я мало разобрался в данной проблеме, но услышал от некоторых людей, что мне следует добавить в докер-композ файл "сеть с драйвером bridge". Тогда у меня и приложение, и база данных будет связана bridge'ом. Также, если я использую bridge, то в строке подключения мне следует использовать имя сервера то, которое я объявил сервисом свою бд в докер-композ.

В итоге, докерфайл:

networks:                            # Создаем сеть
  backend:                           # назовём её backend
    driver: bridge                   # отметим, что эта сеть будет "мостом"

services: 
  web:
    container_name: web
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "80:8080"
    depends_on: 
      - sqlserver
    networks:                        # Наш сервис приложения
      - backend                      # присоединим к нашей сети backend
  
  sqlserver:
    container_name: sqlserver
    image: mcr.microsoft.com/mssql/server:2022-latest
    environment:
      - MSSQL_SA_PASSWORD=saroot1234A$
      - ACCEPT_EULA=Y
    ports:
      - "1433"
    volumes:
      - sql-volume:/var/opt/mssql
    networks:                        # Наш сервис базы данных
      - backend                      # присоединим к нашей сети backend

volumes: 
  sql-volume:

А строка подключения будет к серверу, но не к localhost, а к названию сервиса, который мы сделали в докер-композе. Тоесть, будет не

"Server=localhost; Database=MyDatabase; User Id=sa; Password=saroot1234A$; TrustServerCertificate=true"

А будет

"Server=sqlserver; Database=MyDatabase; User Id=sa; Password=saroot1234A$; TrustServerCertificate=true"

→ Ссылка