VS Code调试WSL2中Docker容器内.NET 7应用报错‘fetch failed’
问题描述
数月未调试的Docker容器中.NET 7应用,此前运行正常。使用VS Code的「Docker .NET Attach (Preview)」配置调试时,先弹出「Acquiring .NET Debugger」通知,随即出现「fetch failed」错误。
已尝试的操作:
- 删除WSL2 Ubuntu中的
~/.vsdbg目录 - 重装VS Code的Docker扩展
Dockerfile内容
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build WORKDIR /app EXPOSE 80 COPY src/zscaler.crt /usr/local/share/ca-certificates/zscaler.crt RUN update-ca-certificates #copy all csproj files and restore as distinct layers. Use the same COPY command #for every dockerfile in the project to take andvantage of docker caching COPY XYZ.sln XYZ.sln COPY src/123/123.csproj src/123/123.csproj COPY src/SearchService/SearchService.csproj src/SearchService/SearchService.csproj COPY src/456/456.csproj src/456/456.csproj COPY src/789/789.csproj src/789/789.csproj COPY src/ABC/ABC.csproj src/ABC/ABC.csproj # Restore package deps RUN dotnet restore XYZ.sln # Copy the app folders over COPY src/SearchService src/SearchService COPY src/789 src/789 WORKDIR /app/src/SearchService RUN dotnet publish -c Debug -o /app/src/out # Build runtime image FROM mcr.microsoft.com/dotnet/aspnet:7.0 WORKDIR /app COPY --from=build /app/src/out . ENTRYPOINT [ "dotnet", "SearchService.dll" ]
.vscode/launch.json内容
{ "version": "0.2.0", "configurations": [ { "name": "Docker .NET Attach (Preview)", "type": "docker", "request": "attach", "platform": "netCore", "sourceFileMap": { "/app": "${workspaceFolder}" } }, { "name": ".NET Core Launch (web)", "type": "coreclr", "request": "launch", "preLaunchTask": "build", "program": "${workspaceFolder}/src/SearchService/bin/Debug/net7.0/SearchService.dll", "args": [], "cwd": "${workspaceFolder}/src/SearchService", "stopAtEntry": false, "serverReadyAction": { "action": "openExternally", "pattern": "\\bNow listening on:\\s+(https?://\\S+)" }, "env": { "ASPNETCORE_ENVIRONMENT": "Development" }, "sourceFileMap": { "/Views": "${workspaceFolder}/Views" } }, { "name": ".NET Core Attach", "type": "coreclr", "request": "attach" } ] }
解决建议
排查容器网络与代理
- 进入容器执行
curl https://aka.ms/getvsdbgsh,验证是否能正常访问调试器下载地址。 - 若存在代理拦截,在Dockerfile的build和runtime阶段添加代理环境变量:
ENV HTTP_PROXY=http://你的代理地址:端口 ENV HTTPS_PROXY=http://你的代理地址:端口 - 同步配置VS Code代理,在
settings.json中添加:"http.proxy": "http://你的代理地址:端口", "https.proxy": "http://你的代理地址:端口"
- 进入容器执行
手动在容器内安装调试器
- 进入运行中的容器:
docker exec -it <容器ID> bash - 执行安装脚本:
curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v latest -l /vsdbg - 安装完成后重新尝试VS Code附加调试。
- 进入运行中的容器:
调整镜像构建配置
- 开发环境下,可将runtime阶段的基础镜像替换为包含调试工具的SDK镜像:
# 替换原runtime阶段 FROM mcr.microsoft.com/dotnet/sdk:7.0 WORKDIR /app COPY --from=build /app/src/out . ENTRYPOINT [ "dotnet", "SearchService.dll" ] - 注意:SDK镜像体积大,仅用于开发,生产环境仍使用aspnet镜像。
- 开发环境下,可将runtime阶段的基础镜像替换为包含调试工具的SDK镜像:
重置WSL与VS Code扩展
- 更新VS Code的C#扩展和Docker扩展至最新版。
- 执行
wsl --shutdown重启WSL服务,重新启动Ubuntu后再尝试调试。 - 检查WSL与Windows的文件共享权限,确保
${workspaceFolder}映射路径可正常访问。
内容的提问来源于stack exchange,提问作者Jakub
相关产品推荐
相关产品推荐

