Merhabalar;
.NET CORE uygulamalarının en güzel özelliklerinin başında platformlar arası desteği tartışılmaz, bende bu yazımda bu örneklerinden biri üzerinde Docker konteynera dağıtılmış bir .NET CORE uygulamasının uzaktan debug işleminin nasıl yapılacağını anlatacağım.
Uzaktan diyorum çünkü aynı makine üzerine bile oluşturulmuş olsa da yine uzak bir makine gibi davranmasından dolayı.
Visual Studio kullanıyorsanız zaten bu işlemi yapabiliyorsunuz, ama Mac veya Linux’da çalışmayacaktır.
Fakat VS Code kullanıyorsanız ve Dockerfile yaratırsanız şu şekilde görünecektir;
FROM mcr.microsoft.com/dotnet/core/sdk:2.2
WORKDIR /app
COPY ./bin/Debug/netcoreapp2.2/publish .
ENTRYPOINT ["dotnet", "MyApplication.dll"]
Evet bu imajı oluşturarak ve container’ı başlatarak uygulamamızı başlatabiliriz, fakat hata ayıklama yapmak istiyorsak nasıl davranmalıyız?
Bunu yapmak için MIEngine’ı Docker imajımıza kurmamız gerekir, bunun içinde yeni bir katman ekleriz.
DockerFile:
FROM mcr.microsoft.com/dotnet/core/sdk:2.2
RUN apt update && \
apt install unzip && \
curl -sSL https://aka.ms/getvsdbgsh | /bin/sh /dev/stdin -v latest -l /vsdbg
WORKDIR /app
COPY ./bin/Debug/netcoreapp2.2/publish .
ENTRYPOINT ["dotnet", "MyApplication.dll"]
Yeni RUN katmanı ilk önce en son paket referanslarını almak için güncelleme yapacak, daha sonra unzip’i kuracak ve nihayet hangi pipes’leri /bin/sh’e bağlayacak şekilde ayarlayacaktır.
Biraz kafa karıştırıcı görünebilir, ancak bunun nedeni Docker imajımızın boyutunu azaltmak için üç komutu birlikte tek bir katman halinde bağlamamızdır. Gerçekten en önemli kısım bu satır:
curl -sSL https://aka.ms/getvsdbgsh | /bin/sh /dev/stdin -v latest -l /vsdbg
Bu, https://aka.ms/getvsdbgsh adresinden bir sh scripti indirir ve yürütmek için onu doğrudan /bin/sh konumuna yönlendirir.
Şimdi imajımızda hata ayıklayıcı yüklü ve şimdi VS Code’yi ona eklememiz gerekiyor.
VS Code’yi uzak hata ayıklayıcısına ekleme
launch.json
Dosyanıza "type": "coreclr"
arasında yeni bir giriş ekleyeceğiz "request": "attach"
. Bu, VS Code işlem seçiciyi başlatmasına ve .NET CORE işlemimizi seçmemize izin verir.
Bir Docker konteynerinde çalışan işlemi nasıl seçerim?
İşlem seçici diyalogu, işlemlerin listesini almak için bir komut yürütme yeteneğine sahip ve bunu uzaktaki bir makineye yapabiliyor.
docker exec -i <container name> /vsdbg/vsdbg
konteyner içindeki süreçleri listelemek için yürütülür , ancak biraz daha düzeltelim:
{
"name": ".NET Core Docker Attach",
"type": "coreclr",
"request": "attach",
"processId": "${command:pickRemoteProcess}",
"pipeTransport": {
"pipeProgram": "docker",
"pipeArgs": [ "exec", "-i", "sunshine-downloader" ],
"debuggerPath": "/vsdbg/vsdbg",
"pipeCwd": "${workspaceRoot}",
"quoteArgs": false
}
}
Şimdi Konteynerı başlatıp, VS Code ile debug yaptığımız da dotnet uygulamamızın kullandığı konteyner içindeki işlemi seçebileceğiz.