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ı değiştirmek için komutlar ekleyebilirsiniz (genellikle base). Bkz. Hata ayıklama ve üretimiçin kapsayıcı görüntüsünü değiştirme. Ancak, yalnızca hata ayıklarken değişiklik yapmak istiyorsanız ancak üretimde değişiklik yapmak istemiyorsanız, başka bir aşama oluşturmanız ve Visual Studio'ya hata ayıklama derlemeleri için bu aşamayı kullanmasını bildirmek için DockerfileFastModeStage derleme ayarını kullanmanız gerekir. bkz. Kapsayıcı görüntüsünü yalnızcahata ayıklama için 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 oluşturma işlemleri

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ı özelleştirme 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 çıktı dosyalarını yerel çözüm klasörünüz altındaki 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ılan bir yöntemdir.

Çok aşamalı yapı, kapsayıcı görüntülerin ara görüntüler üreten aşamalarda oluşturulmasına olanak tanır. Örnek olarak, tipik bir Dockerfile'ı göz önünde bulundurun. İlk aşama Visual Studio'nun oluşturduğu Dockerfile'da base olarak adlandırılır, 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 /appolarak ayarlayan bir ara görüntü base oluşturur.

Sonraki aşama, aşağıdaki gibi görünen build' dir:

# 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

build aşamasının tabandan devam etme yerine kayıt defterinden farklı bir özgün görüntüden (aspnetyerinesdk) başladığını görebilirsiniz. sdk görüntüsü 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 baseyeniden başlar ve yayımlanan çıkışı son görüntüye kopyalamak için COPY --from=publish içerir. Bu işlem, sdk görüntüdeki tüm derleme araçlarını 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:

Sahne Açıklama
taban 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).
inşa etmek 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.
yayınlamak Bu aşama, derleme aşamasından türetilir, projenizi yayımlar ve proje 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

aotdebug aşaması 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 hazırlık aşaması

Proje ısınması, sonraki çalıştırmaların performansını artırmak amacıyla (F5 veya Ctrl+F5) 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 (base aşaması olan çoğu Dockerfile'da) görüntüleri çekin.
  • Dockerfile'ı oluşturun ve kapsayıcıyı başlatın.

Isınma yalnızca Hızlı modunda gerçekleşir, bu nedenle çalışan kapsayıcıda uygulaması 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ştir

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 MS_VS_CONTAINERS_TOOLS_LOGGING_ENABLED'dır ve bu, ardından %tmp%\Microsoft.VisualStudio.Containers.Toolsiçine günlüğe kaydedilir. Docker Compose projeleri için, bu MS_VS_DOCKER_TOOLS_LOGGING_ENABLED'dır, ardından %tmp%\Microsoft.VisualStudio.DockerCompose.Tools'de oturum açar.

Uyarı

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

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.