如何从 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 中,转到菜单 Tools → Options → Crossplatform → Connection Manager - 并添加一个新的连接。指定容器的IP地址或主机名,端口为10222(docker run
命令中的那个),root为无密码用户。
【讨论】:
【参考方案2】:截至 2018 年 5 月,如果您使用 Visual Studio,则可以使用他们的 official support。
您只需要安装 Docker 并添加对 Docker 项目的支持菜单 Project → Docker 支持。
这会创建一个新项目,其中包含 Docker compose 和 dockerfile 到您的项目,然后 Visual Studio 将其链接并允许调试!
【讨论】:
我在我的问题中提到了 VS Docker 工具,这不是我要问的。以上是关于如何从 Visual Studio 调试在 Linux Docker 容器中运行的 .NET Core 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Visual Studio 调试在 Linux Docker 容器中运行的 .NET Core 应用程序