web-dev-qa-db-ja.com

VisualStudioからLinuxDockerコンテナーで実行されている.NETCoreアプリをデバッグする方法

私は自分の手書きのDockerfile/docker-composeファイルを持っています。コマンドラインからコンテナを起動します。ここで、Docker(Linuxベース)コンテナー内のアプリにVS2017(VSCodeではない)をアタッチしたいと思います。かなり簡単な作業のようですが、これを行う方法についての情報が見つかりません。

ガイドを読みました https://github.com/Microsoft/MIEngine/wiki/Offroad-Debugging-of-.NET-Core-on-Linux---OSX-from-Visual-Studio 慎重に。最初は、必要なもののように見えました。Linuxで実行されているnetcoreアプリをリモートでデバッグする方法の説明です。しかし、それは物語の一部、つまりSSH経由でデバッグする方法を説明しているにすぎません。そして、Dockerについて言及しているだけですが、Docker内でアプリをリモートでデバッグする方法については何も述べていません。
ここではDockerにそれほど具体的なものはないはずです。Docker内でvsdbgを実行し、ここにアタッチしているだけです。しかし、明らかにそれは非常に一般的な開発のユースケースであり、これに関する適切な情報がないのは奇妙です。

確かに、 VS Tools for Docker があり、Dockerコンテナ内のアプリのデバッグを簡単に行うことができます。しかし、私にとって、Docker用のVSツールはひどいものです。はい、最初はシームレスに動作します。しかし、ボンネットの下で何が起こっているのかは絶対に不明です。

VSTools for Dockerの機能を調べて、それを再現することができるようです。しかし、それはあまり明白ではありません。追加の「デバッグ」yamlファイルをdocker-compose(docker-compose.vs.debug.g.yml)デバッグの魔法を実行する必要があります。そのyamlを手書きのdocker-composeに追加し、Dockerを実行しますが、VSをアタッチする方法は?コンテナのIPを取得し、そのIPと4022でVSが何も認識できないリモートデバッガを見つけようとしました。また、Tools for Dockerによって作成されたdebug.yamlが、予想どおり4022ポートを公開することについて何も持っていないことも疑わしいです。

P.S.良いガイドが見つかりましたが、Windowsコンテナでは https://github.com/riskfirst/debugging-aspnet-core-windows-docker

10
Shrike

これはどう:

サービスが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ファイルをポータブルPDBとして出力していることを確認します https://github.com/Microsoft/MIEngine/wiki/Offroad-Debugging-of-.NET-Core-on-Linux---OSX -from-Visual-Studio

また、サービスのDockerイメージをビルドするときに、PDBファイルがdllに含まれていることを確認してください。

次に、コンテナーが実行されていて、それをデバッグする必要があると判断した場合、デバッガーコンテナーをサイドカーコンテナーとしてサービスにアタッチできます。

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

次に、Visual Studioで、[ツール]> [オプション]> [クロスプラットフォーム]> [接続マネージャー]に移動し、新しい接続を追加します。コンテナーのIPまたはホスト名を指定し、ポート(docker runコマンドのポート)として10222を指定し、パスワードのないユーザーとしてrootを指定します。

お役に立てば幸いです

4
Mark Jones

今日の時点で、Visual Studioを使用している場合は、それらの 公式サポート を使用できます。

Dockerをインストールし、dockerプロジェクトのサポートを追加する必要がありますProject->Docker support

これにより、docker composeとdockerfileを使用してプロジェクトに新しいプロジェクトが作成され、VSがこれをリンクして、デバグを許可します。

0
rekiem87