Мы пытаемся получить доступ к 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 сервером.
Любая помощь будет принята с благодарностью.