Как я могу подключиться к серверу Sql на inte rnet из контейнера. net Core Linux Docker (используя Docker для Windows)? - PullRequest
0 голосов
/ 08 января 2020

Мы пытаемся получить доступ к Sql базе данных сервера, находящейся в удаленной сети, из контейнера Docker. Однако при каждой попытке подключения просто зависает приложение (без исключений, без тайм-аута, просто без конца).

Воспроизвести легко, создав новое консольное приложение. Net Core 3.1 и добавив этот код (добавить ссылка на пакет Microsoft.Data.SqlClient):

using System;
using System.Threading.Tasks;
using Microsoft.Data.SqlClient;

namespace ConsoleApp1
{
    class Program
    {
        static async Task Main(string[] args)
        {
            var connStr = "Data Source=<public server ip>,1433;Integrated Security=False;Initial Catalog=TestDatabase;User ID=user;Password=password";
            await using var connection = new SqlConnection(connStr);

            await connection.OpenAsync();

            Console.WriteLine("Hello World!");
        }
    }
}

Затем добавьте поддержку Docker через Visual Studio, которая генерирует DOCKERFILE:

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/core/runtime:3.1-buster-slim AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["ConsoleApp1/ConsoleApp1.csproj", "ConsoleApp1/"]
RUN dotnet restore "ConsoleApp1/ConsoleApp1.csproj"
COPY . .
WORKDIR "/src/ConsoleApp1"
RUN dotnet build "ConsoleApp1.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "ConsoleApp1.csproj" -c Release -o /app/publish

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

Теперь, когда мы запускаем проект как ConsoleApp1 -профиль соединение установлено как ожидалось. При запуске проекта с использованием профиля Docker приложение просто зависает при вызове await connection.OpenAsync();.

Нет никаких исключений или чего-либо еще. Он просто не подключается и просто сидит там бесконечно ...

Я понимаю, что запуск контейнера Linux на машине Windows включает в себя все виды магов c, но создание веб-запроса для внешнего страница работает. Это создает у меня впечатление, что это связано с номером порта или характером соединения с Sql сервером.

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 08 января 2020

Как оказалось, новая версия mcr.microsoft.com/dotnet/core/runtime:3.1-buster-slim source-образа намного строже в использовании TLS / Cipher.

Это, в сочетании с ошибкой в ​​SqlClient, вызвало такое поведение. Как выясняется, проблема и различные решения / обходные пути очень широко обсуждаются в репозитории SqlClient:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...