Почему 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 шт):
В общем, я мало разобрался в данной проблеме, но услышал от некоторых людей, что мне следует добавить в докер-композ файл "сеть с драйвером 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"