Я не могу подключиться к базе данных и выполнить миграцию, хотя моя строка подключения работает нормально, когда я подключаюсь к SQL Server Management Studio через файл Docker. Интересно, что я делаю неправильно.
моя строка подключения с dbcontext
"ConnectionStrings": {
"SqlServer": "Server=localhost;Database=socialdb;User Id=sa;Password=Str0ngs@Passw0rd21;Encrypt=false;TrustServerCertificate=True"
}
public static IServiceCollection AddInfrastractureServices(this IServiceCollection services, IConfiguration configuration)
{
var connectionstring = configuration.GetConnectionString("SqlServer");
services.AddDbContext<DatabaseContext>((sp, options) =>
{
options.UseSqlServer(connectionstring);
}
);
return services;
}
Это фактический код, который выдает исключение
public static class DatabaseExtensions
{
public static async Task InitializeDatabaseAsync(this WebApplication app)
{
using var scope = app.Services.CreateScope();
var context = scope.ServiceProvider.GetRequiredService<DatabaseContext>();
context.Database.MigrateAsync().GetAwaiter().GetResult();
}
}
и окончательный файл докера
services:
mongo:
container_name: mongo
restart: always
ports:
- "27017:27017"
# environment:
# MONGO_INITDB_ROOT_USERNAME: vondella
# MONGO_INITDB_ROOT_PASSWORD: V0ndella21
volumes:
- ./db_data/:/data/db/
socialdb:
container_name: socialdb
environment:
- ACCEPT_EULA=Y
- MSSQL_SA_PASSWORD=Str0ngs@Passw0rd21
restart: always
ports:
- "1433:1433"
# volumes:
# - mssql_data:/var/opt/mssql/data
messagebroker:
container_name: messagebroker
hostname: ecomerce-mq
environment:
- RABBITMQ_DEFAULT_USER=guest
- RABBITMQ_DEFAULT_PASS=guest
restart: always
ports:
- "5672:5672"
- "15672:15672"
postqueryapi:
environment:
- ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_HTTP_PORTS=8080
ports:
- "8080"
выброшено исключение
При установке соединения с SQL Server произошла ошибка, связанная с сетью или конкретным экземпляром. Сервер не найден или не был доступен. Убедитесь, что имя экземпляра правильное и что SQL Server настроен на разрешение удаленных подключений. (поставщик: поставщик TCP, ошибка: 40 — не удалось открыть соединение с SQL Server)
SQL-сервер работает в докере, но с той же строкой подключения работает нормально, когда я пытаюсь подключиться с помощью студии управления сервером sql.
Итак, подумайте об этом: для докера ваш компьютер с тем же успехом мог бы находиться на Марсе, насколько ему известно. Вы можете установить ssms в докере и увидеть, что он также не сработает на локальном хосте.
.GetAwaiter().GetResult();
<-- Не делайте этого; ваш метод InitializeDatabaseAsync
поддерживает async
, поэтому просто добавьте модификатор async
и измените последнюю строку на await context.Database.MigrateAsync()
.
Предполагая, что postqueryapi
пытается подключиться к базе данных SQL, тогда в строке подключения:
"SqlServer": "Server=localhost;Database=socialdb;User Id=sa;Password=Str0ngs@Passw0rd21;Encrypt=false;TrustServerCertificate=True"
localhost
будет означать сам контейнер, в котором явно не работает экземпляр базы данных.
Вместо localhost
вы можете попробовать использовать 1) host.docker.internal
(т. е. Server=host.docker.internal
, он должен работать в Windows) 2) имя контейнера базы данных (Server=socialdb
, поскольку все контейнеры находятся в одной сети по умолчанию, или вы можете переместить их в одну и ту же не- по умолчанию)
но с той же строкой подключения работает нормально, когда я пытаюсь подключиться с помощью студии управления сервером sql
Поскольку вы сопоставляете порт для локального компьютера, поэтому, когда вы используете SSMS, он будет использовать 1433
локального хоста, сопоставленный с 1433
портом докер-контейнера.
Смотрите также:
Итак, SQL Server работает на локальном хосте, как на вашем компьютере? Для докера localhost означает локальный хост докера, который не совпадает с dito компьютера.