VS Code를 사용하여 Docker 애플리케이션에서 .NET Core 디버깅
따라서 .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
이제 디버거를 이미지에 번들로 묶지 않고 시작할 때 컨테이너에 디버거를 삽입했습니다.
Reference
이 문제에 관하여(VS Code를 사용하여 Docker 애플리케이션에서 .NET Core 디버깅), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/azure/debugging-your-net-core-in-docker-applications-with-vs-code-3g5d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)