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

Debugging an already-running Docker Linux .NET Core container with Visual Studio 2017

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

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

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

一些具体步骤和示例会有所帮助。

看完了Ankush's blog post,这个怎么样:

如果您的服务基于 microsoft/dotnet 图像,请创建一个新的 Docker 文件 在同一图像上,安装调试器、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 中,转到菜单 工具选项跨平台连接管理器 - 并添加一个新连接。指定 sidecar 容器的 IP 地址或主机名和 10222 作为端口(docker run 命令中的那个),root 作为没有密码的用户。

完成后,您可以简单地关闭 sidecar 容器,留下您的服务容器 运行,并且不公开您的服务的一般操作不需要的任何内容。