Aracılığıyla paylaş


Visual Studio'da Docker kapsayıcılarını özelleştirme

Projenize Docker desteği eklediğinizde Visual Studio tarafından oluşturulan Dockerfile dosyasını düzenleyerek kapsayıcı görüntülerinizi özelleştirebilirsiniz. Visual Studio IDE'den özelleştirilmiş bir kapsayıcı oluştururken veya bir komut satırı derlemesi ayarlarken, Visual Studio'nun projelerinizi oluşturmak için Dockerfile'ı nasıl kullandığını bilmeniz gerekir. Bu tür ayrıntıları bilmeniz gerekir çünkü performans nedenleriyle Visual Studio, Dockerfile'da belirgin olmayan kapsayıcılı uygulamalar oluşturmak ve çalıştırmak için özel bir işlem izler.

Dockerfile dosyasında bir değişiklik yapmak istediğinizi ve sonuçları hem hata ayıklamada hem de üretim kapsayıcılarında görmek istediğinizi varsayalım. Bu durumda, dockerfile dosyasına ilk aşamayı (genellikle base) değiştirmek için komutlar ekleyebilirsiniz. Bkz . Hata ayıklama ve üretim için kapsayıcı görüntüsünü değiştirme. Ancak, yalnızca hata ayıklarken değişiklik yapmak ancak üretim yapmak istemiyorsanız, başka bir aşama oluşturmanız ve Visual Studio'ya derlemelerde hata ayıklama için bu aşamayı kullanmasını bildirmek için derleme ayarını kullanmanız DockerfileFastModeStage gerekir. Bkz . Hata ayıklama için kapsayıcı görüntüsünü değiştirme.

Bu makalede kapsayıcılı uygulamalar için Visual Studio derleme işlemi ayrıntılı olarak açıklanmış, ardından Dockerfile'ın hem hata ayıklamayı hem de üretim derlemelerini etkileyecek şekilde veya yalnızca hata ayıklama için nasıl değiştirileceğine ilişkin bilgiler yer alır.

Visual Studio'da Dockerfile derlemeleri

Not

Bu bölümde, Dockerfile kapsayıcı derleme türünü seçtiğinizde Visual Studio tarafından kullanılan kapsayıcı derleme işlemi açıklanmaktadır. .NET SDK derleme türünü kullanıyorsanız özelleştirme seçenekleri farklıdır ve bu bölümdeki bilgiler geçerli değildir. Bunun yerine bkz. Dotnet publish ile bir .NET uygulamasını kapsayıcıya alma ve kapsayıcı derleme işlemini yapılandırmak için kapsayıcınızı özelleştirme bölümünde açıklanan özellikleri kullanın.

Çok aşamalı derleme

Visual Studio Docker kapsayıcılarını kullanmayan bir proje oluşturduğunda, yerel makinede MSBuild'i çağırır ve çıkış dosyalarını yerel çözüm klasörünüz altında bir klasörde (genellikle bin) oluşturur. Ancak kapsayıcılı bir proje için derleme işlemi Dockerfile'ın kapsayıcılı uygulamayı oluşturmaya yönelik yönergelerini dikkate alır. Visual Studio'da kullanılan Dockerfile birden çok aşamaya ayrılır. Bu işlem Docker'ın çok aşamalı derleme özelliğine dayanır.

Çok aşamalı derleme özelliği, kapsayıcı oluşturma işlemini daha verimli hale getirmenize yardımcı olur ve yalnızca çalışma zamanında uygulamanızın ihtiyaç duyduğu bitleri içermelerine izin vererek kapsayıcıları küçültür. Çok aşamalı derleme .NET Framework projeleri için değil .NET Core projeleri için kullanılır.

Çok aşamalı derleme, kapsayıcı görüntülerinin ara görüntüler üreten aşamalarda oluşturulmasını sağlar. Örnek olarak, tipik bir Dockerfile'ı göz önünde bulundurun. İlk aşama Visual Studio'nun oluşturduğu Dockerfile'da çağrılır base , ancak araçlar bu adı gerektirmez.

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

Dockerfile'daki satırlar, Microsoft Container Registry'den (mcr.microsoft.com) ASP.NET görüntüsüyle başlar ve 80 ve 443 numaralı bağlantı noktalarını kullanıma sunan ve çalışma dizinini olarak /appayarlayan bir ara görüntü base oluşturur.

Sonraki aşama aşağıdaki gibi görünen şeklindedir build:

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

Aşamanın build tabandan devam etme yerine kayıt defterinden farklı bir özgün görüntüden (sdk yerine aspnet) başladığını görebilirsiniz. Görüntü sdk tüm derleme araçlarına sahiptir ve bu nedenle yalnızca çalışma zamanı bileşenlerini içeren aspnet görüntüsünden çok daha büyüktür. Dockerfile dosyasının geri kalanına baktığınızda ayrı bir görüntü kullanmanın nedeni netleşir:

# This stage is used to publish the service project to be copied to the final stage
FROM build AS publish
RUN dotnet publish "WebApplication43.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", "WebApplication43.dll"]

Son aşama, uygulamasından baseyeniden başlar ve yayımlanan çıkışı son görüntüye kopyalamak için öğesini içerir COPY --from=publish . Bu işlem, görüntüdeki tüm derleme araçlarını sdk içermesi gerekmeyen son görüntünün çok daha küçük olmasını mümkün kılar.

Aşağıdaki tabloda Visual Studio tarafından oluşturulan tipik Dockerfile'da kullanılan aşamalar özetlemektedir:

Aşama Açıklama
temel Oluşturulan uygulamanın yayımlandığı temel çalışma zamanı görüntüsünü oluşturur. Çalışma zamanında kullanılabilir olması gereken bağlantı noktaları ve ortam değişkenleri gibi ayarlar buraya gider. Bu aşama, VS'den hızlı modda çalışırken kullanılır (Hata ayıklama yapılandırması için varsayılan).
derleme Proje bu aşamada oluşturulmuş. Projenizi oluşturmak için gerekli bileşenleri içeren .NET SDK temel görüntüsü kullanılır.
publish Bu aşama, derleme aşamasından türetilir ve projenizi yayımlar ve bu aşama son aşamaya kopyalanır.
son Bu aşama, uygulamanın nasıl başlatılıp üretimde veya VS'den normal modda çalıştırılırken (Hata Ayıklama yapılandırması kullanılmadığında varsayılan) nasıl kullanılacağını yapılandırılır.
aotdebug Bu aşama, normal modda hata ayıklamayı desteklemek için VS'den başlatılırken son aşamanın temeli olarak kullanılır (Hata Ayıklama yapılandırması kullanılmadığında varsayılan).

Not

Aşama aotdebug yalnızca Linux kapsayıcıları için desteklenir. Projede yerel Önceden (AOT) dağıtımı etkinleştirildiyse Visual Studio 2022 17.11 ve sonraki sürümlerinde kullanılır.

Proje ısınması

Proje ısınması, sonraki çalıştırmaların (F5 veya Ctrl+F5) performansını artırmak için bir proje için Docker profili seçildiğinde (bir proje yüklendiğinde veya Docker desteği eklendiğinde) gerçekleşen bir dizi adımı ifade eder. Bu davranış, Araçlar>Seçenekleri>Kapsayıcı Araçları altında yapılandırılabilir. Arka planda çalışan görevler şunlardır:

  • Docker Desktop'ın yüklü ve çalışır durumda olup olmadığını denetleyin.
  • Docker Desktop'ın projeyle aynı işletim sistemine ayarlandığından emin olun.
  • Dockerfile'ın ilk aşamasındaki görüntüleri çekin ( base çoğu Dockerfiles içindeki aşama).
  • Dockerfile'ı derleyin ve kapsayıcıyı başlatın.

Isınma yalnızca Hızlı modda gerçekleşir, bu nedenle çalışan kapsayıcının uygulama klasörü birimine bağlı olur. Başka bir deyişle uygulamada yapılan değişiklikler kapsayıcıyı geçersiz kılmaz. Bu davranış hata ayıklama performansını önemli ölçüde artırır ve büyük görüntüleri çekme gibi uzun süre çalışan görevler için bekleme süresini azaltır.

Ayrıntılı kapsayıcı araçları günlüklerini etkinleştirme

Tanılama amacıyla belirli Kapsayıcı Araçları günlüklerini etkinleştirebilirsiniz. Belirli ortam değişkenlerini ayarlayarak bu günlükleri etkinleştirebilirsiniz. Tek kapsayıcılı projeler için ortam değişkeni olur MS_VS_CONTAINERS_TOOLS_LOGGING_ENABLEDve ardından içinde %tmp%\Microsoft.VisualStudio.Containers.Toolsoturum açar. Docker Compose projeleri için, içinde oturum açan %tmp%\Microsoft.VisualStudio.DockerCompose.Tools' dırMS_VS_DOCKER_TOOLS_LOGGING_ENABLED.

Uyarı

Günlük etkinleştirildiğinde ve Azure kimlik doğrulaması için bir belirteç ara sunucusu kullandığınızda, kimlik doğrulama kimlik bilgileri düz metin olarak günlüğe kaydedilebilir. Bkz. Azure kimlik doğrulamayı yapılandırma.

Sonraki adımlar

Dockerfile aşamalarını kullanarak hata ayıklama ve üretim için kullanılan görüntüleri özelleştirme hakkında bilgi edinin. Örneğin, görüntüye yalnızca hata ayıklarken bir araç yükleme. Bkz . Hata ayıklama için kapsayıcı görüntülerini yapılandırma.