다음을 통해 공유


디버깅에 대한 컨테이너 이미지 사용자 지정

참고 항목

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

Debug 구성으로 빌드할 때 컨테이너화된 프로젝트의 빌드 프로세스 성능에 도움이 되는 몇 가지 최적화가 Visual Studio에서 수행됩니다. 컨테이너화된 앱의 빌드 프로세스는 단순히 Docker파일에 설명된 단계를 따르는 것만큼 간단하지 않습니다. 컨테이너에서 빌드하는 것은 로컬 머신에서 빌드하는 것보다 속도가 느립니다. 따라서 디버그 구성으로 빌드하는 경우, Visual Studio는 실제로 로컬 컴퓨터에서 프로젝트를 빌드한 다음, 볼륨 탑재를 사용하여 출력 폴더를 컨테이너에 공유합니다. 이 최적화 기능을 사용하는 빌드를 ‘고속’ 모드 빌드라고 합니다.

docker buildbaseFast 모드에서 Visual Studio는 Docker파일의 첫 번째 단계(일반적으로 단계)만 빌드하도록 지시하는 인수를 사용하여 을 호출합니다. DockerfileFastModeStage컨테이너 도구 MSBuild 속성에 설명된 MSBuild 속성인 을 설정하여 이를 변경할 수 있습니다. Visual Studio는 Dockerfile의 내용에 관계없이 프로세스의 나머지 부분을 처리합니다. 따라서 컨테이너 환경을 사용자 지정하거나 추가 종속성을 설치하기 위해 Dockerfile을 수정하는 경우, 수정 내용을 첫 번째 스테이지에 배치해야 합니다. buildpublishfinal도커파일의 , 또는 단계에 배치된 모든 사용자 지정 단계는 실행되지 않습니다.

이 성능 최적화 기능은 일반적으로 디버그 구성으로 빌드하는 경우에만 수행됩니다. 릴리스 구성에서는 Dockerfile에 지정된 대로 컨테이너에서 빌드가 수행됩니다. 프로젝트 파일에서 ContainerDevelopmentModeFast로 설정하여 릴리스 구성에 대해 이 동작을 사용하도록 설정할 수 있습니다.

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

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

<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을 사용하여 컨테이너에 매핑하고 진입점으로 실행한 다음, Visual Studio에서 연결하여 프로그램에 연결합니다.
.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입니다. buildpublishbase빠른 모드 스테이지는 이 문서의 앞부분에서 설명한 대로 Visual Studio가 앱 실행에 필요한 모든 것을 포함하는 볼륨을 마운트하기 때문에 또는 스테이지에서 상속할 필요가 없으며 스테이지에서 직접 상속할 수 있습니다.

#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 배포를 지원하기 위해 GNU 디버거(GDB)가 설치되지만 최종 런타임 이미지가 아닌 디버깅할 때 사용되는 이미지에만 설치됩니다. Dockerfile에는 true 또는 false일 수 있는 빌드 인수 LAUNCHING_FROM_VS이(가) 포함됩니다. true인 경우 aotdebug 단계가 사용되며, 여기서 GDB가 설치됩니다. 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에서 실행하지 않을 때나 프로덕션에서 사용되는 최종 이미지에 영향을 주지 않고 디버그 시 사용되는 이미지를 사용자 지정할 수 있습니다. 예를 들어 디버깅 중에만 사용할 도구를 설치할 수 있습니다.