阅读完Ankush的博客文章后,您觉得这样如何:
如果您的服务基于microsoft/dotnet镜像,请创建一个基于相同镜像的新Dockerfile,并安装调试器、ssh和unzip。
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文件。请参见
在Visual Studio中从Linux或OS X上进行.NET Core越野调试。
确保在构建服务的Docker镜像时,将PDB文件与DLL文件一起包含。或者更好的方法是,在启动辅助容器时,将带有PDB文件的工件目录挂载到容器中。
然后,当容器正在运行并且您决定需要对其进行调试时,可以将调试器容器作为辅助容器附加到服务中:
docker run -d -p 10222:22 --pid container:<container name> myregistry/dotnetdebugger
然后在Visual Studio中,转到菜单
工具 →
选项 →
Crossplatform →
连接管理器 - 并添加一个新的连接。指定sidecar容器的IP地址或主机名以及10222作为端口(
docker run
命令中的端口),并将root作为用户而不需要密码。
完成后,您可以简单地关闭sidecar容器,使您的服务容器运行,并且不会暴露任何不需要的内容以进行服务的一般操作。