如何从 Visual Studio 调试在 Linux Docker 容器中运行的 .NET Core 应用程序

Posted

技术标签:

【中文标题】如何从 Visual Studio 调试在 Linux Docker 容器中运行的 .NET Core 应用程序【英文标题】:How to debug a .NET Core application running in a Linux Docker container from Visual Studio 【发布时间】:2018-07-17 15:04:39 【问题描述】:

我有自己手写的 Dockerfile/docker-compose 文件。我从命令行启动容器。现在,我想将 Visual Studio 2017(不是 Visual Studio Code)附加到 Docker(基于 Linux)容器内的应用程序。看起来这应该是一项非常容易的任务,但我找不到任何有关如何执行此操作的信息。

我仔细阅读了指南Off-road Debugging of .NET Core on Linux or OS X from Visual Studio。起初它看起来像我需要的——关于如何远程调试在 Linux 中运行的 .NET Core 应用程序的描述。但它只讲述了故事的一部分——如何通过 SSH 进行调试。只是提到了 Docker,但它没有说明如何在 Docker 中远程调试应用程序。

我想这里不应该有太多关于 Docker 的具体内容,它只是在 Docker 内部运行 vsdbg 并附加到这里。但很明显,这是一个非常常见的开发用例,奇怪的是没有这方面的好信息。

当然,我们可以使用VS Tools for Docker 轻松调试 Docker 容器内的应用程序。但对我来说,Docker 的 VS 工具实在是太糟糕了。是的,它们起初可以无缝地工作。但绝对不清楚幕后发生了什么。

似乎我们可以查看 VS Tools for Docker 的功能并尝试重现它。但这不是很明显。它向 docker-compose (docker-compose.vs.debug.g.yml) 添加了一个额外的“调试” YAML 文件,该文件应该具有调试魔力。我尝试将 YAML 内容添加到我的手写 docker-compose 中,运行 Dockers,但是如何附加 Visual Studio?

我获得了容器的 IP 地址,尝试在该 IP 地址上查找远程调试器,结果 4022 Visual Studio 看不到任何内容。同样值得怀疑的是,由 Tools for Docker 创建的文件 debug.yaml 并没有像预期的那样暴露 4022 端口。

P.S.:我找到了a good guide but on Windows containers

【问题讨论】:

我发现这个文档可能有帮助? docs.microsoft.com/en-us/azure/…本文说明如何在本地 Docker 容器中启动 ASP.NET Core Web 应用 感谢您的链接。我读了。它有点过时(.net 1.0),只是告诉“单击并添加 Docker 支持”,但不幸的是没有解释它是如何工作的 仅供参考:这是我关于如何从 VS Code 调试运行 Docker 的 .net 核心单元测试的博文 - techblog.dorogin.com/… 【参考方案1】:

这个怎么样:

如果您的服务基于 microsoft/dotnet Docker 映像,请基于同一映像创建一个新的 dockerfile,然后安装调试器、ssh 和解压缩。

FROM microsoft/dotnet

RUN apt-get update && apt-get -y install openssh-server unzip

RUN mkdir /var/run/sshd && chmod 0755 /var/run/sshd
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin without-password/g' /etc/ssh/sshd_config
RUN sed -i 's/#StrictModes yes/StrictModes no/g' /etc/ssh/sshd_config

RUN service ssh restart

RUN mkdir /root/.vs-debugger && chmod 0755 /root/.vs-debugger
RUN curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v vs2017u1 -l /root/.vs-debugger/

EXPOSE 22

构建并将其推送到您的注册表。

docker build -t myregistry/dotnetdebugger .
docker push myregistry/dotnetdebugger

接下来确保您的服务构建将 PDB 文件作为可移植 PDB 文件输出 - Offroad Debugging of .NET Core on Linux and OS X from Visual Studio

并确保在构建服务的 Docker 映像时将 PDB 文件包含在 DLL 文件中。

然后,当您的容器正在运行并且您决定需要对其进行调试时,您可以将调试器容器作为侧车容器附加到服务:

docker run -d -p 10222:22 --pid container:<container name> - myregistry/dotnetdebugger

然后在 Visual Studio 中,转到菜单 ToolsOptionsCrossplatformConnection Manager - 并添加一个新的连接。指定容器的IP地址或主机名,端口为10222(docker run命令中的那个),root为无密码用户。

【讨论】:

【参考方案2】:

截至 2018 年 5 月,如果您使用 Visual Studio,则可以使用他们的 official support。

您只需要安装 Docker 并添加对 Docker 项目的支持菜单 ProjectDocker 支持

这会创建一个新项目,其中包含 Docker compose 和 dockerfile 到您的项目,然后 Visual Studio 将其链接并允许调试!

【讨论】:

我在我的问题中提到了 VS Docker 工具,这不是我要问的。

以上是关于如何从 Visual Studio 调试在 Linux Docker 容器中运行的 .NET Core 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何设置Visual Studio远程调试

如何从 Visual Studio 调试在 Linux Docker 容器中运行的 .NET Core 应用程序

如何在Visual Studio中调试Windows服务?

visual studio 2012如何调试和运行程序?

Visual Studio 2010:调试时,如何从变量中复制包含回车符的字符串值?

在Visual Studio中调试时,如何检查有关进程令牌的详细信息?