İngilizce dilinde oku

Aracılığıyla paylaş


Kapsayıcı görüntülerini hata ayıklama için özelleştirme

Not

Bu bölümde Dockerfile kapsayıcı derleme türünü seçtiğinizde Docker kapsayıcılarınızı nasıl özelleştirebileceğiniz açıklanmaktadır. .NET SDK derleme türünü kullanıyorsanız özelleştirme seçenekleri farklıdır ve bu bölümdeki bilgilerin çoğu geçerli değildir. Bunun yerine bkz. dotnet publish ile bir .NET uygulamasını kapsayıcılı yapmak.

Hata Ayıklama yapılandırmasında derleme yaparken, Visual Studio'nun kapsayıcılı projelerde derleme sürecinin performansını artıran çeşitli optimizasyonlar bulunmaktadır. Kapsayıcılı uygulamalar için derleme işlemi, Dockerfile'da özetlenen adımları takip etmek kadar basit değildir. Kapsayıcıda derleme, yerel makinede derlemekten daha yavaştır. Bu nedenle, Hata Ayıklama yapılandırmasında derleme yaptığınızda, Visual Studio projelerinizi yerel makinede oluşturur ve ardından birim bağlamayı kullanarak çıkış klasörünü kapsayıcıyla paylaşır. Bu iyileştirmenin etkinleştirildiği bir derleme, Hızlı modu derlemesi olarak adlandırılır.

Hızlı modunda Visual Studio, Docker'a Dockerfile'ın yalnızca ilk aşamasını (normalde base aşaması) derlemesini söyleyen bir bağımsız değişkenle docker build çağırır. MSBuild özelliği DockerfileFastModeStage'ı, Kapsayıcı Araçları MSBuild özellikleri 'de açıklanan şekilde ayarlayarak bunu değiştirebilirsiniz. Visual Studio, Dockerfile içeriğini dikkate almadan işlemin geri kalanını işler. Bu nedenle Dockerfile'ınızı kapsayıcı ortamını özelleştirmek veya ek bağımlılıklar yüklemek gibi bir değişiklik yaptığınızda, değişikliklerinizi ilk aşamaya yerleştirmeniz gerekir. Dockerfile'ın build, publishveya final aşamalarına yerleştirilen özel adımlar yürütülemez.

Bu performans iyileştirmesi, normalde yalnızca Hata Ayıklama yapılandırmasında derleme yapıldığında meydana gelir. Yayın yapılandırmasında, derleme Dockerfile'da belirtildiği şekliyle kapsayıcıda gerçekleşir. Proje dosyasındaki ContainerDevelopmentMode değerini Hızlı olarak ayarlayarak Yayın yapılandırması için bu davranışı etkinleştirebilirsiniz.

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

Tüm yapılandırmalar için performans iyileştirmesini devre dışı bırakmak ve Dockerfile'ın belirttiği şekilde derlemek istiyorsanız, ContainerDevelopmentMode özelliğini proje dosyasında normal olarak aşağıdaki gibi ayarlayın:

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

Performans iyileştirmesini geri yüklemek için özelliğini proje dosyasından kaldırın.

Hata ayıklamaya başladığınızda (F5), mümkünse önceden başlatılan bir kapsayıcı yeniden kullanılır. Önceki kapsayıcıyı yeniden kullanmak istemiyorsanız, Visual Studio'yu yeni bir kapsayıcı kullanmaya zorlamak için Visual Studio'da Yeniden Derleme veya Temiz komutlarını kullanabilirsiniz.

Hata ayıklayıcıyı çalıştırma işlemi, proje ve kapsayıcı işletim sisteminin türüne bağlıdır:

Senaryo Hata ayıklayıcı işlemi
.NET Core uygulamaları (Linux kapsayıcıları) Visual Studio vsdbg indirir ve kapsayıcıya eşler, ardından programınızla ve bağımsız değişkenlerinizle (dotnet webapp.dll) çağrılır ve ardından hata ayıklayıcı işleme eklenir.
.NET Core uygulamaları (Windows kapsayıcıları) Visual Studio, onecoremsvsmon'yi kullanır ve bunu kapsayıcıya eşleyip giriş noktası olarak çalıştırdıktan sonra, Visual Studio buna bağlanır ve programa ekleme yapar.
.NET Framework uygulamaları Visual Studio msvsmon kullanır ve kapsayıcıya eşler, Visual Studio'nun bağlanabileceği giriş noktasının bir parçası olarak çalıştırır ve programa ekler. Bu, normalde başka bir bilgisayarda veya sanal makinede uzaktan hata ayıklamayı ayarlamaya benzer.

vsdbg.exehakkında bilgi için bkz. Visual Studio 'den Linux ve OS X üzerinde .NET Core'un Offroad hata ayıklaması.

Hata ayıklama ve üretim için kapsayıcı görüntüsünü değiştirme

Hem hata ayıklama hem de üretim için kapsayıcı görüntüsünü değiştirmek için base aşamasını değiştirin. Özelleştirmelerinizi, genellikle Dockerfile'ın ilk bölümü olan temel aşama bölümünde Dockerfile'a ekleyin. Dockerfile komutları hakkında bilgi için Docker belgelerindeki Dockerfile başvuru bakın.

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"]

Kapsayıcı görüntüsünü yalnızca hata ayıklama için değiştirme

Kapsayıcılarınızı, üretim derlemelerini etkilemeden tanılama amacıyla bir şey yükleme gibi hata ayıklamaya yardımcı olacak bazı yollarla özelleştirebilirsiniz.

Kapsayıcıyı yalnızca hata ayıklama amacıyla değiştirmek için bir aşama oluşturun ve ardından MSBuild özelliği DockerfileFastModeStage kullanarak Visual Studio'ya hata ayıklarken özelleştirilmiş aşamanızı kullanmasını söyleyin. Dockerfile komutları hakkında bilgi için Docker belgelerindeki Dockerfile başvuru bakın.

Not

Buradaki yönergeler tek kapsayıcı durum için geçerlidir. Docker Compose ile aynı işlemi birden çok kapsayıcı için de yapabilirsiniz, ancak Docker Compose için gereken teknikler biraz farklıdır. Örneğin, aşama dockercompose.debug.yml dosyasındaki bir ayar tarafından denetlenilir.

Aşağıdaki örnekte paketini procps-ngancak yalnızca hata ayıklama modunda yükleyeceğiz. Bu paket, Visual Studio'nun gerektirdiği (.NET 5 ve önceki sürümleri hedeflerken) ancak burada kullanılan Mariner görüntüsünde olmayan pidofkomutunu sağlar. Hızlı mod hata ayıklaması için kullandığımız aşama debug, burada tanımlanan özel bir aşamadır. Hızlı mod aşamasının build veya publish aşamasından devralması gerekmez; Visual Studio bu makalede daha önce açıklandığı gibi uygulamayı çalıştırmak için gereken her şeyi içeren bir birim bağladığından doğrudan base aşamasından devralabilir.

Dockerfile
#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"]

Proje dosyasında, Visual Studio'ya hata ayıklarken özel aşama debug kullanmasını bildirmek için bu ayarı ekleyin.

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

AOT dağıtımıyla hata ayıklama görüntülerini özelleştirme

Yerel AOT dağıtımını desteklemek için GNU hata ayıklayıcı (GDB) yüklenir, ancak yalnızca hata ayıklarken kullanılan görüntüye yüklenir, son çalışma zamanı görüntüsüne değil. Dockerfile, LAUNCHING_FROM_VS olarak belirtilen ve true veya falseolabilecek bir derleme bağımsız değişkeni içerir. trueise, GDB'nin yüklü olduğu aotdebug aşaması kullanılır. Visual Studio'da yalnızca Linux kapsayıcıları için yerel AOT ve GDB'nin desteklendiğini unutmayın.

Dockerfile
# 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"]

Hata ayıklama zamanında kullanılan görüntüyü özelleştirmek için, Visual Studio'dan başlatılmadığında veya üretimde başlatılmadığında kullanılan son görüntüyü etkilemeden Dockerfile'daki aotstage kullanabilirsiniz. Örneğin, yalnızca hata ayıklama sırasında kullanmak üzere bir araç yükleyebilirsiniz.