Sql server 如何从.net Core Linux Docker容器(使用Docker for Windows)连接到internet上的Sql Server?
我们正在尝试从Docker容器中访问远程网络上的Sql Server数据库。但是,每次尝试连接都会挂起应用程序(没有异常,没有超时,只有无休止的等待) 通过创建一个新的.Net Core 3.1控制台应用程序并添加此代码(将包引用添加到Microsoft.Data.SqlClient),可以很容易地进行复制: 现在,当我们作为Sql server 如何从.net Core Linux Docker容器(使用Docker for Windows)连接到internet上的Sql Server?,sql-server,docker,Sql Server,Docker,我们正在尝试从Docker容器中访问远程网络上的Sql Server数据库。但是,每次尝试连接都会挂起应用程序(没有异常,没有超时,只有无休止的等待) 通过创建一个新的.Net Core 3.1控制台应用程序并添加此代码(将包引用添加到Microsoft.Data.SqlClient),可以很容易地进行复制: 现在,当我们作为控制台EAPP1-配置文件启动项目时,连接按预期进行。当使用Docker-profile启动项目时,应用程序只挂起wait connection.OpenAsync()呼叫
控制台EAPP1
-配置文件启动项目时,连接按预期进行。当使用Docker
-profile启动项目时,应用程序只挂起wait connection.OpenAsync()代码>呼叫
没有例外或任何事情。它只是没有连接,只是无限期地坐在那里
我意识到在Windows机器上运行Linux容器需要各种魔法,但是创建一个外部页面的webrequest确实有效。这给我的印象是,它与端口号或与Sql Server连接的性质有关
任何帮助都将不胜感激。事实证明,新版的mcr.microsoft.com/dotnet/core/runtime:3.1-buster-slim
源映像对TLS/密码的使用更加严格
这与SqlClient中的错误一起导致了这种行为。事实证明,这个问题和各种解决方案/变通方法在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!");
}
}
}
#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"]