OK。はじめましょうか。まず、アプリをデバッグモードで公開していることを確認してください!新しいDocker機能のマルチステージビルドを使用してイメージをビルドすることを好むので、Dockerfileのビルドステージの最後に次のように記述します。
RUN dotnet publish -c Debug -o ./results
画像をMinikubeにプッシュするには、ここで説明するローカルコンテナーレジストリを使用します。しかし、あなたはいつものようにそれを行うことができます。コンテナが稼働し始めたら、ハッキングを開始できます。私はその目的でPowershellを使用しますが、同じことを他の端末言語で簡単に書き換えることができます。チュートリアルの手順に従って、必要に応じてechoコマンドでvarの値を1つずつ確認しながら、ターミナルでコマンドを1つずつ実行できます。* .ymlファイルには、次のようなセレクターが必要です。
selector:
matchLabels:
app: mywebapp
それを取得して、Powershellターミナルで$ Selector変数を定義するために使用します。
$Selector = 'app=mywebapp'
コンテナー化されたアプリケーションが実行されているポッドをセレクターで見つける必要があります。
$pod = kubectl get pods --selector=$Selector -o jsonpath='{.items[0].metadata.name}';
ポッドにコンテナが1つしかないと仮定すると、そのコンテナでコマンドを実行できます。デフォルトでは、コンテナーにはvsdbgがインストールされていないため、先に進んでインストールします。
kubectl exec $pod -i -- apt-get update;
kubectl exec $pod -i -- apt-get install -y unzip;
kubectl exec $pod -i -- curl -sSL https://aka.ms/getvsdbgsh -o '/root/getvsdbg.sh';
kubectl exec $pod -i -- bash /root/getvsdbg.sh -v latest -l /vsdbg;
次に、コンテナー内でアプリのPIDを見つける必要があります。
$prid = kubectl exec $pod -i -- pidof -s dotnet;
通常は1ですが、想定する数を少なくすることをお勧めします。それでおしまい。これでデバッガを起動できます:
kubectl exec $pod -i -- /vsdbg/vsdbg --interpreter=mi --attach $prid;
ウィンドウを閉じる前に次のコマンドを実行することを忘れないでください。そうしないと、アプリが永久にスタックします。
-target-detach
-gdb-exit
すべてのASP.NET Coreプロジェクトで使用できるので、すべてをまとめて再利用可能なスクリプトを作成し、ルートに近い場所に保存しましょう。
param(
# the selector from your yml file
# selector:
# matchLabels:
# app: myweb
# -Selector app=myweb
[Parameter(Mandatory=$true)][string]$Selector
)
Write-Host '1. searching pod by selector:' $Selector '...';
$pod = kubectl get pods --selector=$Selector -o jsonpath='{.items[0].metadata.name}';
Write-Host '2. installing updates ...';
kubectl exec $pod -i -- apt-get update;
Write-Host '3. installing unzip ...';
kubectl exec $pod -i -- apt-get install -y --no-install-recommends unzip;
Write-Host '4. downloading getvsdbgsh ...';
kubectl exec $pod -i -- curl -sSL https://aka.ms/getvsdbgsh -o '/root/getvsdbg.sh';
Write-Host '5. installing vsdbg ...';
kubectl exec $pod -i -- bash /root/getvsdbg.sh -v latest -l /vsdbg;
$cmd = 'dotnet';
Write-Host '6. seaching for' $cmd 'process PID in pod:' $pod '...';
$prid = kubectl exec $pod -i -- pidof -s $cmd;
Write-Host '7. attaching debugger to process with PID:' $pid 'in pod:' $pod '...';
kubectl exec $pod -i -- /vsdbg/vsdbg --interpreter=mi --attach $prid;
これで、ターミナルがスクリプトフォルダーから実行されているときに、このスクリプトを次のように実行できます。
powershell -ExecutionPolicy Bypass -File kubedbg.ps1 -Selector app=mywebapp
しかし、Visual Studioからデバッグしているのではないですか?はい!さらに進んで、Visual Studio MIEngineからターミナルプロセスを起動します。Visual Studioでプロジェクトを開きます。次の内容の新しいXMLファイルを追加し、kubedbg.xmlという名前を付けます。
<PipeLaunchOptions xmlns="http://schemas.microsoft.com/vstudio/MDDDebuggerOptions/2014"
PipePath="powershell" TargetArchitecture="x64" MIMode="clrdbg"
PipeArguments="
-ExecutionPolicy Bypass
-File C:\kube\kubedbg.ps1
-Selector app=mywebapp">
<LaunchCompleteCommand>None</LaunchCompleteCommand>
</PipeLaunchOptions>
では-File
、パラメータあなたは私たちが以前に作成したスクリプトファイルへの絶対パスを指定する必要があります。次に、Ctrl + Alt + Aを押してコマンドウィンドウを開き、次のコマンドを実行します
Debug.MIDebugLaunch /Executable:dotnet /OptionsFile:absolute_path_to_kubedbg_xml
。ただし、[デバッグ]メニューから[すべてデタッチ]を押す以外の方法でデバッグを停止しないでください。このコマンドは、常に書き込むのにあまり便利ではありませんが。幸い、Visual Studioでは、パラメーターを使用してコマンドのエイリアスを指定できます。最終的には、kubedbg.xml
プロジェクトごとに新しいファイルが必要になります。これを念頭に置いて、コマンドウィンドウで次のコマンドを入力して、最初のエイリアスを作成します。
alias kubedbg.mywebapp Debug.MIDebugLaunch /Executable:dotnet
/OptionsFile:absolute_path_to_kubedbg.xml
その後、コマンドウィンドウでkubedbg.mywebappを実行するだけでデバッグを開始できます。さらに良いのは、検索ツールバーのコンボボックスから同じコマンドを実行できることですが、プレフィックスが付い>kubedbg.mywebapp.
ています。テキスト補完もあるので、難しくありません。コマンドエイリアスの詳細については、こちらをご覧ください。幸せなデバッグ!PS:おまけとして、パブリッククラウド内で実行している場合でも、アプリをデバッグできるのとまったく同じ方法です。kubectlがパブリッククラウドのクラスターに割り当てられると、実際のクラスター内のプロセスIDが1に等しくないため、同じスクリプトで動作し、想定される返済が少なくなります。