无法调试 dotnet core GenericHost docker 容器
Posted
技术标签:
【中文标题】无法调试 dotnet core GenericHost docker 容器【英文标题】:Unable to debug dotnet core GenericHost docker container 【发布时间】:2020-10-29 02:19:16 【问题描述】:我在最新的 Windows 版本 Windows 10 2004 上使用 Linux 容器,并启用了 WSL 2 和 Docker Desktop 2.3.0.3 (45519)。
我右键单击 docker-compose 文件,然后选择 Set as Startup Project
。
然后我按 F5 进行调试。
我可以看到使用docker ps
运行的图像,但是没有命中断点。
我无法查看日志(在 Visual Studio 容器窗口上),因为它说:
It was not possible to find any compatible framework version
The framework 'Microsoft.AspNetCore.App', version '3.1.0' was not found.
- No frameworks were found.
You can resolve the problem by installing the specified framework and/or SDK.
The specified framework can be found at:
- https://aka.ms/dotnet-core-applaunch?framework=Microsoft.AspNetCore.App&framework_version=3.1.0&arch=x64&rid=debian.10-x64
我已经通过上面给出的链接安装了 SDK。
构建输出如下:
1>------ Build started: Project: Libertas.Host.Tickers.ScheduledTasks, Configuration: Debug Any CPU ------
1>Libertas.Host.Tickers.ScheduledTasks -> C:\Users\User\Source\Repos\myrepo\Libertas\src\Libertas.Host.Tickers.ScheduledTasks\bin\Debug\netcoreapp3.1\Libertas.Host.Tickers.ScheduledTasks.dll
1>docker build -f "C:\Users\User\Source\Repos\myrepo\Libertas\src\Libertas.Host.Tickers.ScheduledTasks\Dockerfile" --force-rm -t libertashosttickersscheduledtasks:dev --target base --label "com.microsoft.created-by=visual-studio" --label "com.microsoft.visual-studio.project-name=Libertas.Host.Tickers.ScheduledTasks" "C:\Users\User\Source\Repos\myrepo\Libertas\src"
1>Sending build context to Docker daemon 1.362MB
1>
1>Step 1/4 : FROM mcr.microsoft.com/dotnet/core/runtime:3.1-buster-slim AS base
1> ---> 86a2e7d45948
1>Step 2/4 : WORKDIR /app
1> ---> Running in d1ed1740d43e
1>Removing intermediate container d1ed1740d43e
1> ---> 90bd1703e28d
1>Step 3/4 : LABEL com.microsoft.created-by=visual-studio
1> ---> Running in 2626d5865d89
1>Removing intermediate container 2626d5865d89
1> ---> da74703374d2
1>Step 4/4 : LABEL com.microsoft.visual-studio.project-name=Libertas.Host.Tickers.ScheduledTasks
1> ---> Running in 7a381e7ea47a
1>Removing intermediate container 7a381e7ea47a
1> ---> fd2dd439cce6
1>Successfully built fd2dd439cce6
1>Successfully tagged libertashosttickersscheduledtasks:dev
1>SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.
1>docker rm -f 9ff95181e06801ed3d4b4d5743397604b743d77c840f2047fb2caee046e5d8eb
1>Error: No such container: 9ff95181e06801ed3d4b4d5743397604b743d77c840f2047fb2caee046e5d8eb
1>docker run -dt -v "C:\Users\User\vsdbg\vs2017u5:/remote_debugger:rw" -v "C:\Users\User\Source\Repos\myrepo\Libertas\src\Libertas.Host.Tickers.ScheduledTasks:/app" -v "C:\Users\User\Source\Repos\myrepo\Libertas\src:/src/" -v "C:\Users\User\AppData\Roaming\Microsoft\UserSecrets:/root/.microsoft/usersecrets:ro" -v "C:\Users\User\.nuget\packages\:/root/.nuget/fallbackpackages" -e "DOTNET_USE_POLLING_FILE_WATCHER=1" -e "NUGET_PACKAGES=/root/.nuget/fallbackpackages" -e "NUGET_FALLBACK_PACKAGES=/root/.nuget/fallbackpackages" --name Libertas.Host.Tickers.ScheduledTasks_1 --entrypoint tail libertashosttickersscheduledtasks:dev -f /dev/null
1>ba95df9d32d6a0af07b1eab32af606131e075b2afff664c4003dbe3eae349543
========== Build: 1 succeeded, 0 failed, 6 up-to-date, 0 skipped ==========
我的 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 ["Libertas.Host.Tickers.ScheduledTasks/Libertas.Host.Tickers.ScheduledTasks.csproj", "Libertas.Host.Tickers.ScheduledTasks/"]
COPY ["Libertas.Application.Tickers.ScheduledTasks/Libertas.Application.Tickers.ScheduledTasks.csproj", "Libertas.Application.Tickers.ScheduledTasks/"]
COPY ["PolygonIo.WebSocket/PolygonIo.WebSocket.csproj", "PolygonIo.WebSocket/"]
RUN dotnet restore "Libertas.Host.Tickers.ScheduledTasks/Libertas.Host.Tickers.ScheduledTasks.csproj"
COPY . .
WORKDIR "/src/Libertas.Host.Tickers.ScheduledTasks"
RUN dotnet build "Libertas.Host.Tickers.ScheduledTasks.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "Libertas.Host.Tickers.ScheduledTasks.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Libertas.Host.Tickers.ScheduledTasks.dll"]
我无法点击任何断点,甚至无法确认应用程序是否正在运行。我有一个 Generic Host 应用程序,我什至没有在public static void Main(string[] args)
中打第一行的断点。
非常感谢指针。
更新和修复
所以这是确凿的证据,特别是因为这是一个控制台应用程序,而不是一个 AspNetCore 应用程序。
It was not possible to find any compatible framework version
The framework 'Microsoft.AspNetCore.App', version '3.1.0' was not found.
- No frameworks were found.
You can resolve the problem by installing the specified framework and/or SDK.
The specified framework can be found at:
- https://aka.ms/dotnet-core-applaunch?framework=Microsoft.AspNetCore.App&framework_version=3.1.0&arch=x64&rid=debian.10-x64
我发现我的一个引用库引用了Grpc.AspNetCore
。
一旦我将这段代码移出,它就可以运行(我可以在容器实例没有运行之前确认),并进行完整的调试。
编译成功,容器运行,容器内的应用程序似乎从未启动。
问题 我想深入了解原因,因为我不完全了解这如何解决所有问题以及将来可以采取哪些措施来避免(似乎任何引用意外或以其他方式引用 AspNetCore 依赖项的库的控制台应用程序都可能有同样的问题)。
【问题讨论】:
你能发布你重要的 csproj 文件吗? 【参考方案1】:我遇到了类似的问题...嗯,我认为原因很相似,就我而言,我什么都做不了,我什至无法构建项目,我有编译错误,“简单”那些...大声笑...假设using system;
是错误的,并且默认情况下还有其他一些库。
经过大量调查,我发现我的项目在 net standard 2.0 中,但其中一个 nuget 包是针对 net standard 2.1 的,删除该包并找到修复该部分代码的方法解决了问题.
我相信的原因与您所追求的类似,在添加库时,您正在添加外部代码,您无法控制的外部代码,所以如果外部库引用了另一个不兼容的库你的项目,就像我的情况一样,所以我相信这些库正在努力决定它是要成为控制台还是 Web 服务器应用程序,你是否尝试过查看创建的进程?
我还查看了您提到的库 (https://www.nuget.org/packages/Grpc.AspNetCore),然后单击依赖项,然后就是这个包:
Grpc.AspNetCore.Server.ClientFactory
这可能是导致崩溃的原因。
小心使用 nuget 包,它们非常酷且“有用”,但请查看依赖关系,有时最好自己编写代码,这是我的教训。 更多详情:https://docs.microsoft.com/en-us/dotnet/standard/library-guidance/dependencies
【讨论】:
【参考方案2】:问题我想深入了解原因,因为我不完全理解这如何解决所有问题以及将来可以采取哪些措施来避免(似乎任何控制台应用程序引用了意外或以其他方式引用的库AspNetCore 依赖可能有同样的问题)。
在 Visual Studio 解决方案资源管理器中向我们展示了具有 Nuget 包及以上的依赖关系树,即 Frameworks 列表 Microsoft.NETCore.App:
这就是我们可以看到 GitHub Repo 引用 AspNetCore 的方式:
<FrameworkReference Include="Microsoft.AspNetCore.App" />
我怎样才能阻止这种情况发生?
-
检查框架的解决方案资源管理器。
对配置和依赖项进行单元测试。
始终查看您导入的包依赖项。
如果您正在寻找经典的故事,那就结束了here。
Iria 讨论的问题可以通过 NuGet 版本范围和通配符表示法来避免。在引用包依赖时,NuGet 支持使用区间表示法来指定版本范围,总结如下:
+-----------+---------------+-------------------------------------------------------+
| Notation | Applied rule | Description |
+-----------+---------------+-------------------------------------------------------+
| 1.0 | x ≥ 1.0 | Minimum version, inclusive |
| (1.0,) | x > 1.0 | Minimum version, exclusive |
| [1.0] | x == 1.0 | Exact version match |
| (,1.0] | x ≤ 1.0 | Maximum version, inclusive |
| (,1.0) | x < 1.0 | Maximum version, exclusive |
| [1.0,2.0] | 1.0 ≤ x ≤ 2.0 | Exact range, inclusive |
| (1.0,2.0) | 1.0 < x < 2.0 | Exact range, exclusive |
| [1.0,2.0) | 1.0 ≤ x < 2.0 | Mixed inclusive minimum and exclusive maximum version |
| (1.0) | invalid | invalid |
+-----------+-------------
当您添加包时强制执行一个版本,这样您就可以跟踪不同版本(以及最终的 .net 框架版本)的依赖关系。
【讨论】:
以上是关于无法调试 dotnet core GenericHost docker 容器的主要内容,如果未能解决你的问题,请参考以下文章
WinDbg 加载 dotnet core 的 sos.dll 辅助调试方法
dotnetCore系列:使用Visual Studio code 创建DotNet Core 1.0应用并调试