VS Code ile Docker Üzerinde ki .NET Core Uygulamalarında Uzaktan Debugging

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.jsonDosyanı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.

IT alanında 16 sene önce donanım ile başlayan tecrübem, network ve sonrasında iş analizi, yazılım geliştirme ve proje yöneticiliği alanlarında devam etmiştir. Endüstriyel yazılımlar, sahadan veri toplama ve analizleri, otomatik etiketleme ve barkod sistemleri, otomatik tartım ve robotik konularında tecrübe sahibiyim. Sanayi 4.0 kapsamında imalat sanayinin dijital dönüşümünde çok fazla projenin hayata geçmesini sağladım. Open Source projelerle uzun süre ilgilendim, analiz ve implementasyonu konularında tecrübe edindim. Bunlar dışında hobi amacıyla başlasam da sonradan ürüne dönüşen, geliştirme kartları ile farklı çalışmalarım olmuştur. Raspberry Pi üzerinde yaptığım donanımsal ve yazılımsal işler ile çok farklı ürünler ortaya çıkartarak tecrübe edindim.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these <abbr title="HyperText Markup Language">HTML</abbr> tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>