Контейнер Docker .NET Core 3.0 не подключается к SQL Server

Мы обновили некоторые из наших приложений .NET Core 2.2 до .NET Core 3.0. После обновления наши приложения, работающие в контейнерах Docker, не могут подключиться к SQL Server 2016, работающему на автономном компьютере в нашей доменной сети. Просматривая трассировку пакетов, мы видим, что соединение зависает при рукопожатии перед входом в систему и, в конечном итоге, прерывается. Возврат к .NET Core 2.2 сразу решает проблему, и наши контейнеры снова могут подключаться к нашим базам данных.

Очевидно, что мы убедились в отсутствии проблем с DNS, поскольку эти контейнеры работают в производственной среде с .NET Core 2.2. .NET Core 3.0 ломает их, поскольку они не могут подключиться к SQL Server по сети, поэтому мы пока откатываемся до версии 2.2 и прекращаем обновление до тех пор, пока не сможем определить, почему контейнеры .NET Core 2.2 подключаются к нашим серверам SQL, а .NET Core 3.0 контейнеры нет.

Мы также создали новые проекты .NET Core 3.0 с нуля, чтобы проверить соединение. Результат тот же: время ожидания контейнеров истекает во время предварительного входа в SQL Server. При изменении проекта обратно на .NET Core 2.2 вместе с EF Core обратно на 2.2.6 проблема сразу же решается.

Поскольку мы используем EF Core для доступа к данным, мы также попытались оставить EF Core на версии 2.2.6, но обновив проект до .NET Core 3.0, но время ожидания соединения по-прежнему прерывается.

Если мы не добавим поддержку Docker и не запустим приложения как консольные или веб-приложения (не в контейнерах), то с .NET Core 3.0 проблем не возникнет. Только когда мы помещаем их в контейнер, приложения .NET Core 3.0 не могут подключиться к SQL Server.

Согласно предложению Дэна в комментариях ниже, я изменил доступ к данным в тестовом проекте на Microsoft.Data.SqlClient, используя рукописный SQL и DataReader. Затем я воссоздал Dockerfile для .net core 3.0 и убедился, что ссылка на правильный образ контейнера. Такое же поведение: зависает при рукопожатии PreLogin с SQL Server. Перешел на .net core 2.2 и смог подключаться и читать данные с SQL Server.


person no1    schedule 26.09.2019    source источник
comment
У меня нет ответа, но я предполагаю, что вы используете System.Data.SqlClient? Если да, мне любопытно, есть ли у вас такая же проблема с Microsoft.Data.SqlClient. Может быть, вы могли бы попробовать с тестовым контейнером.   -  person Dan Guzman    schedule 26.09.2019
comment
Отличное предложение, но, к сожалению, это точно такое же поведение в тестовом контейнере: работает с .net core 2.2, но не с .net core 3.0. Добавлю в пост. Спасибо хоть!   -  person no1    schedule 26.09.2019
comment
@ no1 как вы подключаетесь к автономному ms sql из контейнерного приложения ядра dotnet?   -  person Hameed Syed    schedule 11.05.2020


Ответы (2)


Похоже, это связано с версией TLS, используемой образом Linux. С помощью команды .NET Core в GitHub мы изменили образ с buster-slim на бионический в Dockerfile.

FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-bionic AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/core/sdk:3.0-bionic AS build

https://github.com/dotnet/SqlClient/issues/222

person no1    schedule 27.09.2019
comment
Почти два дня я безуспешно смотрю, как решить проблему. Это решение, которое работает. - person Tomas; 30.01.2020
comment
Потратил 2 дня, пока не нашел вопрос и ответ. Спасибо! - person Florin-Constantin Ciubotariu; 20.03.2020
comment
У меня проблема с подключением с использованием aspnetcore3.1 к удаленному лазеру sql dB. Пробовал это исправить, и это не сработало. - person reggieboyYEAH; 11.04.2020
comment
Такая же проблема возникает в .net core 3.1. Также использовал то же решение для его решения. - person Rickedb; 23.09.2020
comment
Провел 1 с половиной дня. - person Hp93; 14.10.2020
comment
ты спас всю мою неделю xd ' - person Daniel Segura Pérez; 13.07.2021

Изменения на -bionic может быть недостаточно для некоторого разработчика, который использует SQL Server локально.

Для тех, кто использует SQL Server локально (localhost), изменение строки подключения Data Source с localhost на указанный IP-адрес может решить проблему.

"ConnectionStrings": {"myDb1": "Data Source=DESKTOP-MGSE697;Initial Catalog=master;User ID=sa;Password=xxx"}

"ConnectionStrings": {"myDb1": "Data Source=xxx.xxx.xxx.xxx,1433;Initial Catalog=master;User ID=sa;Password=123456"}

В большинстве случаев протокол TCP \ IP диспетчера конфигурации SQL Server еще не включен. Меняя их в Computer Management = ›SQL Server Config Manager =› Protocols for MSSQLSERVER (в моем случае).

Снимок экрана управления компьютером

person Dragon Leon    schedule 15.04.2021