使用 Visual Studio 2017 调试已运行的 Docker Linux .NET Core 容器

Posted

技术标签:

【中文标题】使用 Visual Studio 2017 调试已运行的 Docker Linux .NET Core 容器【英文标题】:Debugging an already-running Docker Linux .NET Core container with Visual Studio 2017 【发布时间】:2018-07-01 01:22:36 【问题描述】:

使用 Visual Studio,当我创建一个 .NET Core 应用程序并在 Linux 容器中运行它时,我可以使用 Visual Studio 2017 轻松调试它。

但是,当我从命令行使用 docker run 运行相同的图像实例(发布版本)时,我无法在 Visual Studio 2017 中找到附加到该实例的方法。

Visual Studio 是如何做到这一点的,我该如何为已经运行的 Docker Linux .NET Core 容器做同样的事情?另外,如果 Docker 镜像实例在远程 Linux 机器上运行,我该如何做呢?

几个具体步骤和一个例子会很有帮助。

【问题讨论】:

【参考方案1】:

读过Ankush's blog post,怎么样:

如果您的服务基于 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 文件输出。看 Off-road Debugging of .NET Core on Linux or OS X from Visual Studio.

并确保在构建服务的 Docker 映像时将 PDB 文件包含在 DLL 文件中。或者更好的是,当您启动边车容器时,卷挂载带有 PDB 文件的人工制品目录。

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

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

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

完成后,您可以简单地关闭 sidecar 容器,让您的服务容器继续运行,并且不会暴露您的服务的一般操作不需要的任何内容。

【讨论】:

知道为什么在按照这些说明操作后我无法通过其 IP 地址和 10222 连接到调试器吗? VS 尝试连接超时。我正在“网络”下使用 docker inspect 检索 IP。

以上是关于使用 Visual Studio 2017 调试已运行的 Docker Linux .NET Core 容器的主要内容,如果未能解决你的问题,请参考以下文章

从 Visual Studio 调试独立的 exe

已解决在 Visual Studio 中设置 JavaScript/TypeScript 的断点 脚本出现自动中断错误

Visual Studio2017 远程调试 Remote Debugger

Visual Studio 2017 中的远程调试

远程调试 Azure 网站一个 Visual Studio 2017 项目

Visual Studio 2017 远程调试