使用 Visual Studio,当我创建 .NET Core 应用程序并在 Linux 容器中运行它时,我可以使用 Visual Studio 2017 轻松调试它。
但是,当我从命令行使用 docker run
运行相同的图像实例(发布版本)时,我无法在 Visual Studio 2017 中找到附加到该实例的方法。
Visual Studio 如何做到这一点以及我如何为已经运行的 Docker Linux .NET Core 容器做同样的事情?另外,如果 Docker 镜像实例在远程 Linux 机器上运行,我该如何做同样的事情?
一些具体步骤和示例会有所帮助。
最佳答案
已阅读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 文件中。或者更好的是,当您启动 Side Car 容器时,卷挂载一个带有 PDB 文件的人工制品目录。
然后当您的容器正在运行并且您决定需要调试它时,您可以将调试器容器作为边车容器附加到服务:
docker run -d -p 10222:22 --pid container:<container name> myregistry/dotnetdebugger
然后在 Visual Studio 中,转到菜单工具 → 选项 → 跨平台 → 连接管理器 - 并添加一个新的连接。指定 sidecar 容器的 IP 地址或主机名和 10222 作为端口(docker run
命令中的端口),root 作为没有密码的用户。
完成后,您可以简单地关闭 sidecar 容器,让您的服务容器继续运行,并且不公开任何服务的一般操作不需要的内容。
关于.net - 使用 Visual Studio 2017 调试已经运行的 Docker Linux .NET Core 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48381127/