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

时间:2018-02-07 10:46:39

标签: visual-studio debugging docker .net-core remote-debugging

我有自己的手写Dockerfile / docker-compose文件。我从命令行启动容器。现在我想将VS2017(不是VSCode)连接到Docker(基于Linux)容器中的应用程序。它似乎应该是非常容易的任务,但我找不到任何有关如何执行此操作的信息。

我仔细阅读了指南https://github.com/Microsoft/MIEngine/wiki/Offroad-Debugging-of-.NET-Core-on-Linux---OSX-from-Visual-Studio。起初它看起来像我需要的 - 关于如何远程调试在Linux中运行的netcore应用程序的描述。但它只讲述了故事的一部分 - 如何通过SSH进行调试。刚刚提到Docker但没有说明如何远程调试Docker中的应用程序 我想在这里应该没有太多具体的Docker,它只是在Docker中运行vsdbg并附加在这里。但显然这是一个非常常见的开发用例,并且奇怪的是没有关于此的好消息。

当然,有VS Tools for Docker使用它我们可以轻松地在Docker容器中调试应用程序。但对我来说VS Tools for Docker非常糟糕。是的,他们一开始就无缝工作。但绝对不清楚幕后发生了什么。

似乎我们可以查看Docker的VSTools并尝试重现它。但这不是很明显。它为docker-compose(docker-compose.vs.debug.g.yml)添加了一个额外的“调试”yaml文件,它应该可以进行调试。我把那个yaml添加到我手写的docker-compose,运行Dockers但是如何附加VS?我获得了我的容器的IP,试图在该IP上找到一个远程调试器,并且4022 VS看不到任何东西。还有人怀疑,Tools for Docker创建的debug.yaml没有任何关于暴露4022端口的信息。

P.S。在Windows容器上找到了一个很好的指南 - https://github.com/riskfirst/debugging-aspnet-core-windows-docker

2 个答案:

答案 0 :(得分:4)

这个怎么样:

如果您的服务基于microsoft / dotnet映像,请根据同一映像创建一个新的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输出 https://github.com/Microsoft/MIEngine/wiki/Offroad-Debugging-of-.NET-Core-on-Linux---OSX-from-Visual-Studio

在构建服务的docker镜像时,确保dll中包含PDB文件。

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

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

然后在visual studio中,转到工具&gt;选项&gt; Crossplatform&gt;连接管理器 - 并添加新连接。指定容器的IP或主机名,10222作为端口(docker run命令中的那个),root指定为没有密码的用户。

希望有所帮助

答案 1 :(得分:0)

截至今天,如果您使用的是visual studio,则可以使用他们的official support

您只需安装docker并添加对docker项目Project->Docker support的支持。

这会为你的项目创建一个带有docker compose和dockerfile的新项目,然后VS链接它并允许重新编译!