다음을 통해 공유


디버깅을 위한 컨테이너 이미지 사용자 지정

메모

이 섹션에서는 Dockerfile 컨테이너 빌드 유형을 선택할 때 Docker 컨테이너를 사용자 지정하는 방법을 설명합니다. .NET SDK 빌드 유형을 사용하는 경우 사용자 지정 옵션이 다르며 이 섹션의 대부분의 정보는 적용되지 않습니다. 대신에 dotnet publish 명령어를 사용하여 .NET 앱을 컨테이너화하는 것을참조하세요.

디버그 구성에서 빌드하는 경우 Visual Studio에서 컨테이너화된 프로젝트에 대한 빌드 프로세스의 성능에 도움이 되는 몇 가지 최적화가 있습니다. 컨테이너화된 앱의 빌드 프로세스는 Dockerfile에 설명된 단계를 수행하는 것만큼 간단하지 않습니다. 컨테이너에서 빌드하는 것은 로컬 머신에서 빌드하는 것보다 느립니다. 따라서 디버그 구성에서 빌드할 때 Visual Studio는 실제로 로컬 머신에서 프로젝트를 빌드한 다음 볼륨 탑재를 사용하여 출력 폴더를 컨테이너에 공유합니다. 이 최적화를 사용하도록 설정된 빌드를 빠른 모드 빌드라고 합니다.

빠른 모드에서 Visual Studio는 Dockerfile의 첫 번째 단계(일반적으로 base 단계)만 빌드하도록 Docker에 지시하는 인수를 사용하여 docker build 호출합니다. MSBuild 속성 DockerfileFastModeStage를 설정하여 변경할 수 있으며, 이는 Container Tools MSBuild 속성에 설명되어 있습니다. Visual Studio는 Dockerfile의 내용과 관계없이 나머지 프로세스를 처리합니다. 따라서 컨테이너 환경을 사용자 지정하거나 추가 종속성을 설치하는 등 Dockerfile을 수정하는 경우 첫 번째 단계에서 수정 사항을 적용해야 합니다. Dockerfile의 build, publish또는 final 단계에 배치된 사용자 지정 단계는 실행되지 않습니다.

이 성능 최적화는 일반적으로 디버그 구성에서 빌드할 때만 발생합니다. 릴리스 구성에서 빌드는 Dockerfile에 지정된 대로 컨테이너에서 발생합니다. 프로젝트 파일에서 ContainerDevelopmentMode을(를) 빠른로 설정하여 릴리스 구성에 대해 이 동작을 활성화할 수 있습니다.

<PropertyGroup Condition="'$(Configuration)' == 'Release'">
   <ContainerDevelopmentMode>Fast</ContainerDevelopmentMode>
</PropertyGroup>

모든 구성에 대한 성능 최적화를 사용하지 않도록 설정하고 Dockerfile에서 지정한 대로 빌드하려면 다음과 같이 프로젝트 파일에서 ContainerDevelopmentMode 속성을 일반 설정합니다.

<PropertyGroup>
   <ContainerDevelopmentMode>Regular</ContainerDevelopmentMode>
</PropertyGroup>

성능 최적화를 복원하려면 프로젝트 파일에서 속성을 제거합니다.

디버깅(F5)을 시작하면 가능하면 이전에 시작된 컨테이너가 다시 사용됩니다. 이전 컨테이너를 다시 사용하지 않으려면 Visual Studio에서 다시 빌드 또는 정리 명령을 사용하여 Visual Studio에서 새 컨테이너를 사용하도록 강제할 수 있습니다.

디버거를 실행하는 프로세스는 프로젝트 및 컨테이너 운영 체제의 유형에 따라 달라집니다.

시나리오 디버거 프로세스
.NET Core 앱 (Linux 컨테이너) Visual Studio는 vsdbg을 다운로드하여 컨테이너에 매핑한 후, 프로그램과 인수(즉, dotnet webapp.dll)를 사용하여 호출되며, 이어서 디버거가 프로세스에 연결됩니다.
.NET Core 앱 (Windows 컨테이너) Visual Studio는 onecoremsvsmon를 사용하여 컨테이너에 매핑하고 진입점으로 실행한 다음, 그것에 연결해서 프로그램에 접속합니다.
.NET Framework 앱 Visual Studio는 msvsmon을 컨테이너에 매핑하고, Visual Studio에서 연결할 수 있는 진입점의 일부로 실행하며, 프로그램에 연결합니다. 이는 일반적으로 다른 컴퓨터 또는 가상 머신에서 원격 디버깅을 설정하는 방법과 유사합니다.

vsdbg.exe대한 자세한 내용은 Visual Studio Linux 및 OS X에서 .NET Core의오프로드 디버깅을 참조하세요.

디버깅 및 프로덕션을 위한 컨테이너 이미지 수정

디버깅 및 프로덕션 모두에 대한 컨테이너 이미지를 수정하려면 base 단계를 수정합니다. 기본 단계 섹션(일반적으로 Dockerfile의 첫 번째 섹션)의 Dockerfile에 사용자 지정을 추가합니다. Dockerfile 명령에 대한 자세한 내용은 Docker 설명서의 Dockerfile 참조 참조하세요.

# This stage is used when running from VS in fast mode (Default for Debug configuration)
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
# <add your commands here>

# This stage is used to build the service project
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["WebApplication3/WebApplication3.csproj", "WebApplication3/"]
RUN dotnet restore "WebApplication3/WebApplication3.csproj"
COPY . .
WORKDIR "/src/WebApplication3"
RUN dotnet build "WebApplication3.csproj" -c Release -o /app/build

# This stage is used to publish the service project to be copied to the final stage
FROM build AS publish
RUN dotnet publish "WebApplication3.csproj" -c Release -o /app/publish

# This stage is used in production or when running from VS in regular mode (Default when not using the Debug configuration)
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApplication3.dll"]

디버깅에 대해서만 컨테이너 이미지 수정

프로덕션 빌드에 영향을 주지 않고 진단 목적으로 무언가를 설치하는 등 디버깅에 도움이 되는 특정 방법으로 컨테이너를 사용자 지정할 수 있습니다.

디버깅에 대해서만 컨테이너를 수정하려면 스테이지를 만든 다음 MSBuild 속성 DockerfileFastModeStage 사용하여 디버깅할 때 Visual Studio에 사용자 지정된 단계를 사용하도록 지시합니다. Dockerfile 명령에 대한 자세한 내용은 Docker 설명서의 Dockerfile 참조 참조하세요.

메모

여기에 있는 지침은 단일 컨테이너 사례에 적용됩니다. Docker Compose를 사용하여 여러 컨테이너에 대해 동일한 작업을 수행할 수도 있지만 Docker Compose에 필요한 기술은 약간 다릅니다. 예를 들어 스테이지는 dockercompose.debug.yml 파일의 설정에 의해 제어됩니다.

다음 예제에서는 패키지 procps-ng설치하지만 디버그 모드에서만 설치합니다. 이 패키지는 Visual Studio에서 필요하지만(.NET 5 이하를 대상으로 하는 경우) 여기서 사용되는 Mariner 이미지에 없는 명령 pidof제공합니다. 빠른 모드 디버깅에 사용하는 단계는 여기에 정의된 사용자 지정 단계인 debug. 빠른 모드 단계는 build 또는 publish 단계에서 상속할 필요가 없으며, Visual Studio는 이 문서의 앞부분에서 설명한 대로 앱을 실행하는 데 필요한 모든 것을 포함하는 볼륨을 탑재하기 때문에 base 단계에서 직접 상속할 수 있습니다.

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

# This stage is used when running from VS in fast mode (Default for Debug configuration)
FROM mcr.microsoft.com/dotnet/aspnet:6.0-cbl-mariner2.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM base AS debug
RUN tdnf install procps-ng -y

# This stage is used to build the service project
FROM mcr.microsoft.com/dotnet/sdk:6.0-cbl-mariner2.0 AS build
WORKDIR /src
COPY ["WebApplication1/WebApplication1.csproj", "WebApplication1/"]
RUN dotnet restore "WebApplication1/WebApplication1.csproj"
COPY . .
WORKDIR "/src/WebApplication1"
RUN dotnet build "WebApplication1.csproj" -c Release -o /app/build

# This stage is used to publish the service project to be copied to the final stage
FROM build AS publish
RUN dotnet publish "WebApplication1.csproj" -c Release -o /app/publish

# This stage is used in production or when running from VS in regular mode (Default when not using the Debug configuration)
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApplication1.dll"]

프로젝트 파일에서 이 설정을 추가하여 디버깅할 때 사용자 지정 단계 debug 사용하도록 Visual Studio에 지시합니다.

  <PropertyGroup>
     <!-- other property settings -->
     <DockerfileFastModeStage>debug</DockerfileFastModeStage>
  </PropertyGroup>

AOT 배포를 사용하여 디버깅 이미지 사용자 지정

네이티브 AOT 배포를 지원하기 위해 GDB(GNU 디버거)가 설치되지만 최종 런타임 이미지가 아니라 디버깅할 때 사용되는 이미지에만 설치됩니다. Dockerfile에는 true 또는 false수 있는 빌드 인수 LAUNCHING_FROM_VS 포함되어 있습니다. true경우 GDB가 설치된 aotdebug 단계가 사용됩니다. Visual Studio는 Linux 컨테이너용 네이티브 AOT 및 GDB만 지원합니다.

# These ARGs allow for swapping out the base used to make the final image when debugging from VS
ARG LAUNCHING_FROM_VS
# This sets the base image for final, but only if LAUNCHING_FROM_VS has been defined
ARG FINAL_BASE_IMAGE=${LAUNCHING_FROM_VS:+aotdebug}

# ... (other stages omitted)

# This stage is used as the base for the final stage when launching from VS to support debugging in regular mode (Default when not using the Debug configuration)
FROM base as aotdebug
USER root
# Install GDB to support native debugging
RUN apt-get update \
    && apt-get install -y --no-install-recommends \
    gdb
USER app

# This stage is used in production or when running from VS in regular mode (Default when not using the Debug configuration)
FROM ${FINAL_BASE_IMAGE:-mcr.microsoft.com/dotnet/runtime-deps:8.0} AS final
WORKDIR /app
EXPOSE 8080
COPY --from=publish /app/publish .
ENTRYPOINT ["./WebApplication1"]

Dockerfile의 aotstage 사용하여 Visual Studio에서 시작하지 않을 때 또는 프로덕션 환경에서 사용되는 최종 이미지에 영향을 주지 않고 디버그 시간에 사용되는 이미지를 사용자 지정할 수 있습니다. 예를 들어 디버깅 중에만 사용할 도구를 설치할 수 있습니다.