VS Code를 사용하여 Docker 애플리케이션에서 .NET Core 디버깅

.NET Core의 애플리케이션을 구축할 때 가장 좋은 점 중 하나는 플랫폼 간 지원을 통해 애플리케이션 as a Docker container 을 배포할 수 있다는 것입니다. Visual Studio를 사용하는 경우 built in support for Docker이 있지만 Mac이나 Linux를 사용하는 경우에는 작동하지 않습니다. 저와 같은 경우 VS Code을 편집기로 사용하는 것이 좋습니다.

따라서 .NET용 Dockerfile을 생성하면 다음과 같이 표시됩니다.

FROM mcr.microsoft.com/dotnet/core/sdk:2.2
WORKDIR /app
COPY ./bin/Debug/netcoreapp2.2/publish .
ENTRYPOINT ["dotnet", "MyApplication.dll"]



엄청난! 해당 이미지를 빌드하고 컨테이너를 시작하여 이제 애플리케이션을 실행할 수 있지만 디버그하려는 경우에는 어떻게 됩니까?

원격 디버깅 활성화



논리적으로 생각해보면 Docker에서 애플리케이션을 실행할 때 기본적으로 원격으로 실행됩니다. 물론, 동일한 시스템에 원격으로 있을 수 있지만 여전히 "원격"이며 이것이 우리가 디버깅에 대해 생각해야 하는 방식입니다!

이렇게 하려면 빌드 중인 Docker 이미지에 MIEngine을 설치해야 합니다. 이를 위해 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"]



새로운 RUN 레이어는 먼저 apt 을 업데이트하여 모든 최신 패키지 참조를 가져온 다음 unzip 을 설치하고 마지막으로 curl 을 실행하여 /bin/sh 으로 파이프합니다. 다소 혼란스러워 보일 수 있지만 Docker 이미지의 크기를 줄이기 위해 세 개의 명령을 단일 레이어로 연결하기 때문입니다. 실제로 가장 중요한 부분은 다음 줄입니다.

curl -sSL https://aka.ms/getvsdbgsh | /bin/sh /dev/stdin -v latest -l /vsdbg



이것은 sh에서 https://aka.ms/getvsdbgsh 스크립트를 다운로드하고 실행을 위해 /bin/sh으로 직접 파이프하고 몇 가지 인수, 가장 중요한 것은 원격 디버거가 추출될 /vsdbg을 제공합니다.

이제 이미지에 디버거가 설치되어 있으므로 VS Code를 연결하도록 설정해야 합니다.

원격 디버거에 VS Code 연결


launch.json"type": "coreclr""request": "attach" 파일에 새 항목을 추가할 것입니다. 이렇게 하면 VS Code가 프로세스 선택기를 시작하고 .NET Core 프로세스를 선택할 수 있습니다.

하지만 잠깐, Docker 컨테이너에서 실행 중입니다. 해당 프로세스를 어떻게 선택합니까?

고맙게도 프로세스 선택기 대화 상자는 프로세스 목록을 가져오는 명령을 실행할 수 있고 원격 시스템에 대해 수행할 수 있습니다.

후드 아래에서 컨테이너 내의 프로세스를 나열하기 위해 docker exec -i <container name> /vsdbg/vsdbg을 실행하지만 조금 더 멋지게 할 것입니다.

{
    "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
    }
}



이제 컨테이너를 실행한 다음 VS Code에서 디버거를 시작하면 애플리케이션이 사용 중인 컨테이너 내에서 dotnet 프로세스를 선택할 수 있습니다.

결론



이제 VS Code를 선택한 편집기로 사용하고 Docker 컨테이너에서 실행되는 애플리케이션을 디버그할 수 있습니다. OmniSharp’s wiki 에서 다루는 SSH를 통한 디버깅을 포함하여 이를 통해 해결할 수 있는 고급 시나리오가 있습니다.

사실 저는 이것을 .NET Core에서 실행하기 위해 구축하고 있는 F# 애플리케이션을 디버깅하는 데 사용하고 있습니다. 😉

행복한 디버깅! 😁

보너스 아이디어: 볼륨이 있는 추가 레이어 제거



내가 이 게시물을 내부적으로 공유했을 때 동료가 Dockerfile 에 새 레이어를 추가하지 않고 이 문제를 해결하는 방법에 대한 아이디어를 내놓았습니다. 실제로 미리 빌드된 이미지를 디버깅할 수 있습니다(디버깅 기호가 있다고 가정).

이미지가 기반으로 하는 배포판(Ubuntu, Alpine, ARM 등)용 vsdbg 패키지를 다운로드하여 이를 수행할 수 있습니다. 이 패키지는 컴퓨터에서 셸 스크립트를 읽고(또는 컨테이너로 다운로드 😉) 결정한 다음 컨테이너를 시작할 때 경로를 볼륨으로 마운트:

docker run --rm -v c:/path/to/vsdbg:/vsdbg --name my-dotnet-app my-dotnet-app


이제 디버거를 이미지에 번들로 묶지 않고 시작할 때 컨테이너에 디버거를 삽입했습니다.

좋은 웹페이지 즐겨찾기