I have my own hand written Dockerfile/docker-compose files. I start containers from command line. Now I want to attach Visual Studio 2017 (not Visual Studio Code) to my application inside a Docker (Linux-based) container. It seems it should a pretty easy task, but I can't find any information on how to do this.
I read through the guide Off-road Debugging of .NET Core on Linux or OS X from Visual Studio carefully. At first it looked like what I needed - a description on how to remotely debug a .NET Core application running in Linux. But it only tells a part of the story - how to debug via SSH. And just mentions Docker, but it says nothing to how to remotely debug an application inside Docker.
I guess there shouldn't be much specific of Docker here, it's just running vsdbg
inside Docker and attaching here. But obviously it's a very common dev use case and it's weird that there's no good information on this.
Surely, there are VS Tools for Docker using which we can easily do debugging of an application inside a Docker container. But for me, VS Tools for Docker are just terrible. Yes, they work seamlessly at first. But it is absolute unclear what is going on under the hood.
It seems that we just can look up what VS Tools for Docker do and try to reproduce that. But it's not very obvious. It adds an additional "debug" YAML file to docker-compose (docker-compose.vs.debug.g.yml
) which should do the debugging magic. I tried to add that YAML content to my hand-written docker-compose, run Dockers, but how can I attach Visual Studio?
I get the IP address of my container, tried to find a remote debugger on that IP address and 4022 that Visual Studio can't see anything. Also it's suspicious that file debug.yaml created by Tools for Docker has nothing about exposing the 4022 port as it could be expected.
P.S.: I found a good guide but on Windows containers
Open the Debug view by selecting the Debugging icon on the left side menu. Select the green arrow at the top of the pane, next to . NET Core Launch (console). Other ways to start the program in debugging mode are by pressing F5 or choosing Run > Start Debugging from the menu.
How about this:
If your service is based off of the microsoft/dotnet Docker image, create a new dockerfile based on the same image, and install the debugger, ssh and 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
Build and push this to your registry.
docker build -t myregistry/dotnetdebugger .
docker push myregistry/dotnetdebugger
Next ensure that your service's build is outputting the PDB files as portable PDB files - Offroad Debugging of .NET Core on Linux and OS X from Visual Studio
And ensure that the PDB files are included with the DLL files when you build your service's Docker image.
Then when your container is running and you decide that you need to debug it, you can attach the debugger container as a side car container to the service:
docker run -d -p 10222:22 --pid container:<container name> - myregistry/dotnetdebugger
Then in Visual Studio, go to menu Tools → Options → Crossplatform → Connection Manager - and add a new connection. Specify the IP address or hostname of the container, 10222 as the port (the one in the docker run
command), and root as the user with no password.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With