Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (seongtaejeong at gmail.com)
홈페이지
첨부 파일
 

Visual Studio 2022 - .NET 5 프로젝트를 Docker Support로 실행했을 때 오류

이상하군요, 제목처럼 Visual Studio 2022에서 기본 상태의 Console App 프로젝트를 만들어 F5 키를 눌러 실행했더니 이런 오류가 발생합니다.

Debugging Error

Cannot find container to attach, check if the correct container is running or not.

이때 "Containers" 뷰에는 이런 오류 메시지가 나옵니다.

It was not possible to find any compatible framework version
The framework 'Microsoft.NETCore.App', version '6.0.0' was not found.
  - The following frameworks were found:
      5.0.17 at [/usr/share/dotnet/shared/Microsoft.NETCore.App]

You can resolve the problem by installing the specified framework and/or SDK.

The specified framework can be found at:
  - https://aka.ms/dotnet-core-applaunch?framework=Microsoft.NETCore.App&framework_version=6.0.0&arch=x64&rid=debian.10-x64

아니, 왜 .NET 5.0 프로젝트에서 6.0을 찾아 실행하려는 것일까요? ^^;




일단, Visual Studio가 실행하는 docker run 명령어를,

docker run -dt -v "%USERPROFILE%\vsdbg\vs2017u5:/remote_debugger:rw" -v "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Sdks\Microsoft.Docker.Sdk\tools\linux-x64\net6.0:/VSTools:ro" -v "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\CommonExtensions\Microsoft\HotReload:/HotReloadAgent:ro" -v "C:\temp\test_dmp\test_dmp:/app:rw" -v "C:\temp\test_dmp:/src/:rw" -v "F:\nuget_root:/.nuget/fallbackpackages3:rw" -v "C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages:/.nuget/fallbackpackages:rw" -v "C:\Program Files\dotnet\sdk\NuGetFallbackFolder:/.nuget/fallbackpackages2:rw" -e "DOTNET_USE_POLLING_FILE_WATCHER=1" -e "NUGET_PACKAGES=/.nuget/fallbackpackages3" -e "NUGET_FALLBACK_PACKAGES=/.nuget/fallbackpackages;/.nuget/fallbackpackages2;/.nuget/fallbackpackages3" --name test_dmp --entrypoint dotnet testdmp:dev --roll-forward Major /VSTools/DistrolessHelper/DistrolessHelper.dll --wait


추려서 다음과 같이 /bin/bash로 실행해 봅니다.

c:\temp> docker run -v "%USERPROFILE%\vsdbg\vs2017u5:/remote_debugger:rw" -v "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Sdks\Microsoft.Docker.Sdk\tools\linux-x64\net6.0:/VSTools:ro" -v "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\CommonExtensions\Microsoft\HotReload:/HotReloadAgent:ro" -v "C:\temp\test_dmp\test_dmp:/app:rw" -v "C:\temp\test_dmp:/src/:rw" -v "F:\nuget_root:/.nuget/fallbackpackages3:rw" -v "C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages:/.nuget/fallbackpackages:rw" -v "C:\Program Files\dotnet\sdk\NuGetFallbackFolder:/.nuget/fallbackpackages2:rw" -e "DOTNET_USE_POLLING_FILE_WATCHER=1" -e "NUGET_PACKAGES=/.nuget/fallbackpackages3" -e "NUGET_FALLBACK_PACKAGES=/.nuget/fallbackpackages;/.nuget/fallbackpackages2;/.nuget/fallbackpackages3" -it --name test_dmp testdmp:dev /bin/bash

root@2e002735586d:/app# 

그럼 dockerfile에 지정된 대로 runtime만 있는 상태이고, 실행까지 잘 됩니다.

# dotnet --list-sdks
# dotnet --list-runtimes
Microsoft.NETCore.App 5.0.17 [/usr/share/dotnet/shared/Microsoft.NETCore.App]

# dotnet /app/bin/Debug/net5.0/test_dmp.dll
Hello World!

혹시나 싶어 Visual Studio가 실행하는 것과 동일한 명령어로 진행해도,

c:\temp\test_dmp> docker exec -it 2e002735586d dotnet /app/bin/Debug/net5.0/test_dmp.dll
Hello World!

What's next:
    Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug 2e002735586d
    Learn more at https://docs.docker.com/go/debug-cli/

역시나 잘 됩니다. ^^; 아니 도대체 뭐가 문제인 걸까요?




그런데, 가만 보니 "docker run" 시에 -v 볼륨으로 연결된 경로에 "net6.0"이 있습니다.

docker run -v "%USERPROFILE%\vsdbg\vs2017u5:/remote_debugger:rw" -v "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Sdks\Microsoft.Docker.Sdk\tools\linux-x64\net6.0:/VSTools:ro" ...[생략]... -it --name test_dmp testdmp:dev /bin/bash

실제로 "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Sdks\Microsoft.Docker.Sdk\tools\linux-x64" 경로를 보면, 하위에 "net6.0", "net7.0", "net8.0"만 있고 5.0 이하가 없습니다. 그러고 보니, "dotnet run" 시에 DistrolessHelper.dll을 실행하는 명령어가 있는데,

docker run -dt ...[생략]... --entrypoint dotnet testdmp:dev --roll-forward Major /VSTools/DistrolessHelper/DistrolessHelper.dll --wait 

"--roll-forward Major"가 있다고 해도 저 명령어는 정상적으로 실행되지 않을 것입니다. 일례로 위에서 실행해 두었던 container에서 저 명령어를 실행해 보면,

# dotnet --roll-forward Major /VSTools/DistrolessHelper/DistrolessHelper.dll
It was not possible to find any compatible framework version
The framework 'Microsoft.NETCore.App', version '6.0.0' was not found.
  - The following frameworks were found:
      5.0.17 at [/usr/share/dotnet/shared/Microsoft.NETCore.App]

You can resolve the problem by installing the specified framework and/or SDK.

The specified framework can be found at:
  - https://aka.ms/dotnet-core-applaunch?framework=Microsoft.NETCore.App&framework_version=6.0.0&arch=x64&rid=debian.10-x64

정확히 동일한 오류가 발생합니다. 어쩌면 Visual Studio 입장에서 F5 디버깅 시에 중요한 것은 DistrolessHelper.dll의 실행 여부일 것입니다. 따라서 저것만 실행할 수 있다면 아마도 정상적으로 동작할 것 같은데요, 어쩔 수 없습니다. ^^; .NET 6를 함께 설치하는 수밖에!

따라서 Dockerfile에 다음과 같이 내용을 추가해,

#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/runtime:5.0 AS base
WORKDIR /app

RUN apt-get update && apt-get install -y --no-install-recommends clang zlib1g-dev wget ca-certificates

RUN wget https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
RUN dpkg -i packages-microsoft-prod.deb
RUN rm packages-microsoft-prod.deb

RUN apt update && apt install -y dotnet-sdk-6.0

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["test_dmp/test_dmp.csproj", "test_dmp/"]
RUN dotnet restore "./test_dmp/test_dmp.csproj"
COPY . .
WORKDIR "/src/test_dmp"
RUN dotnet build "./test_dmp.csproj" -c $BUILD_CONFIGURATION -o /app/build

FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "./test_dmp.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "test_dmp.dll"]

다시 실행하면 정상적으로 .NET 5 앱에 대한 F5 디버깅이 가능합니다.




그렇다면 혹시, 우리가 만든 앱도 .NET 6 환경에서 실행하는 것은 아닐까요? 다행히 Debug 창을 보면,

------------------------------------------------------------------------------
You may only use the Microsoft Visual Studio .NET/C/C++ Debugger (vsdbg) with
Visual Studio Code, Visual Studio or Visual Studio for Mac software to help you
develop and test your applications.
------------------------------------------------------------------------------
Loaded '/usr/share/dotnet/shared/Microsoft.NETCore.App/5.0.17/System.Private.CoreLib.dll'. Symbol loading disabled by Include/Exclude setting.
Loaded '/app/bin/Debug/net5.0/test_dmp.dll'. Symbols loaded.
Loaded '/usr/share/dotnet/shared/Microsoft.NETCore.App/5.0.17/System.Runtime.dll'. Symbol loading disabled by Include/Exclude setting.
Loaded '/usr/share/dotnet/shared/Microsoft.NETCore.App/5.0.17/System.Console.dll'. Symbol loading disabled by Include/Exclude setting.
Loaded '/usr/share/dotnet/shared/Microsoft.NETCore.App/5.0.17/System.Threading.dll'. Symbol loading disabled by Include/Exclude setting.
Loaded '/usr/share/dotnet/shared/Microsoft.NETCore.App/5.0.17/System.Text.Encoding.Extensions.dll'. Symbol loading disabled by Include/Exclude setting.
Loaded '/usr/share/dotnet/shared/Microsoft.NETCore.App/5.0.17/Microsoft.Win32.Primitives.dll'. Symbol loading disabled by Include/Exclude setting.

정상적으로 5.0 프레임워크로 실행한 것을 확인할 수 있습니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 7/15/2024]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 16  17  18  19  20  21  22  23  24  [25]  26  27  28  29  30  ...
NoWriterDateCnt.TitleFile(s)
13312정성태4/8/202311630Windows: 244. Win32 - 시간 만료를 갖는 MessageBox 대화창 구현 (개선된 버전)파일 다운로드1
13311정성태4/7/202312850C/C++: 163. Visual Studio 2022 - DirectShow 예제 컴파일(WAV Dest)
13310정성태4/6/202311968C/C++: 162. Visual Studio - /NODEFAULTLIB 옵션 설정 후 수동으로 추가해야 할 library
13309정성태4/5/202312436.NET Framework: 2107. .NET 6+ FileStream의 구조 변화
13308정성태4/4/202312479스크립트: 47. 파이썬의 time.time() 실숫값을 GoLang / C#에서 사용하는 방법 [1]
13307정성태4/4/202311606.NET Framework: 2106. C# - .NET Core/5+ 환경의 Windows Forms 응용 프로그램에서 HINSTANCE 구하는 방법
13306정성태4/3/202311599Windows: 243. Win32 - 윈도우(cbWndExtra) 및 윈도우 클래스(cbClsExtra) 저장소 사용 방법
13305정성태4/1/202312881Windows: 242. Win32 - 시간 만료를 갖는 MessageBox 대화창 구현 (쉬운 버전) [1]파일 다운로드1
13304정성태3/31/202313221VS.NET IDE: 181. Visual Studio - C/C++ 프로젝트에 application manifest 적용하는 방법
13303정성태3/30/202311460Windows: 241. 환경 변수 %PATH%에 DLL을 찾는 규칙
13302정성태3/30/202312189Windows: 240. RDP 환경에서 바뀌는 %TEMP% 디렉터리 경로
13301정성태3/29/202312759Windows: 239. C/C++ - Windows 10 Version 1607부터 지원하는 /DEPENDENTLOADFLAG 옵션 [1]파일 다운로드1
13300정성태3/28/202311908Windows: 238. Win32 - Modal UI 창에 올바른 Owner(HWND)를 설정해야 하는 이유
13299정성태3/27/202311715Windows: 237. Win32 - 모든 메시지 루프를 탈출하는 WM_QUIT 메시지
13298정성태3/27/202311684Windows: 236. Win32 - MessageBeep 소리가 안 들린다면?
13297정성태3/26/202313148Windows: 235. Win32 - Code Modal과 UI Modal
13296정성태3/25/202312232Windows: 234. IsDialogMessage와 협업하는 WM_GETDLGCODE Win32 메시지 [1]파일 다운로드1
13295정성태3/24/202312391Windows: 233. Win32 - modeless 대화창을 modal처럼 동작하게 만드는 방법파일 다운로드1
13294정성태3/22/202312358.NET Framework: 2105. LargeAddressAware 옵션이 적용된 닷넷 32비트 프로세스의 가용 메모리 - 두 번째
13293정성태3/22/202311760오류 유형: 853. dumpbin - warning LNK4048: Invalid format file; ignored
13292정성태3/21/202312509Windows: 232. C/C++ - 일반 창에도 사용 가능한 IsDialogMessage파일 다운로드1
13291정성태3/20/202312747.NET Framework: 2104. C# Windows Forms - WndProc 재정의와 IMessageFilter 사용 시의 차이점
13290정성태3/19/202312466.NET Framework: 2103. C# - 윈도우에서 기본 제공하는 FindText 대화창 사용법파일 다운로드1
13289정성태3/18/202311415Windows: 231. Win32 - 대화창 템플릿의 2진 리소스를 읽어들여 자식 윈도우를 생성하는 방법파일 다운로드1
13288정성태3/17/202311619Windows: 230. Win32 - 대화창의 DLU 단위를 pixel로 변경하는 방법파일 다운로드1
13287정성태3/16/202311600Windows: 229. Win32 - 대화창 템플릿의 2진 리소스를 읽어들여 윈도우를 직접 띄우는 방법파일 다운로드1
... 16  17  18  19  20  21  22  23  24  [25]  26  27  28  29  30  ...