如何解决“在Docker Desktop中运行时SqlClient连接失败”?

How to solve “SqlClient connection fails when ran in Docker Desktop”?

提问人:Paulo Santos 提问时间:10/13/2023 最后编辑:halferPaulo Santos 更新时间:11/13/2023 访问量:77

问:

我正在尝试连接到开发箱上的本地 SQL Server Express 实例。

我正在使用以下代码:

var cs = new System.Data.SqlClient.SqlConnectionStringBuilder();
cs.InitialCatalog = "dev_db";
cs.DataSource = @"(local)\SQLEXPRESS";
cs.IntegratedSecurity = false;
cs.ConnectTimeout = 5;
cs.Encrypt = false;
cs.UserID = "user";
cs.Password = "password";

var xpto = new System.Data.SqlClient.SqlConnection(cs.ConnectionString);
xpto.Open();

这在控制台或 Windows 应用中工作正常,但在尝试在 Docker 桌面(配置为 Linux)中运行的 Web API 项目时会失败。

完全相同的代码。

这是抛出的异常:

System.Data.SqlClient.SqlException

与 SQL Server 建立连接时发生与网络相关的错误或特定于实例的错误。
找不到服务器或无法访问服务器。验证实例名称是否正确,以及 SQL Server 是否配置为允许远程连接。
(提供程序:TCP 提供程序,错误:25 - 连接字符串无效)

有没有人遇到过这个问题并知道如何解决它?

要先发制人地回答问题,请执行以下操作:

  1. 我还按照这个答案来配置 SQL Server Express。

  2. 完这个答案后,我尝试使用和使用我的开发箱的 IP 地址。两次尝试都产生了相同的结果。host.docker.internal

// Attempt with host.docker.internal
cs.DataSource = @"host.docker.internal\SQLEXPRESS"; 
// Same error

// Attempt with dev box IP
cs.DataSource = @"192.168.15.3\SQLEXPRESS";
// Same error.
  1. SQL Server Express 的实例位于开发箱上,而不是在 Docker 中。

  2. SQL Server Express 配置为允许远程连接:

SQLExpress configuration

编辑添加:

这是 Docker 文件:

#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

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

FROM build AS publish
RUN dotnet publish "TestProject.csproj" -c Release -o /app/publish /p:UseAppHost=false

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

编辑添加:

与 PostgreSQL 数据库的连接成功。只有 SQL Server Express 让我头疼。

C# docker sql-server-express sqlclient

评论

0赞 mxmissile 10/13/2023
尝试禁用 Windows 防火墙(仅作为测试)。
1赞 Dalorzo 10/13/2023
它是在您的 docker 容器上运行还是在您的本地计算机上运行?SQLEXPRESS
0赞 Dalorzo 10/13/2023
你能给我们看看你的 docker 文件吗?您在 docker 容器上打开了哪些端口?
0赞 Joel Coehoorn 10/13/2023
由于 docker 是一个单独的网络层,因此可能需要在 Windows 防火墙中显式打开 SQL Server 端口。
0赞 ProgrammingLlama 10/13/2023
您是否使用 将端口转发到 SQL Server 容器中?-p realport:containerport

答: 暂无答案