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 /app
olarak 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 (aspnet
yerinesdk
) 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 base
yeniden 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.Tools
iç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.
İlgili içerik
- kapsayıcı projeleri için MSBuild özellikleri.
- Windows'da Dockerfile
- Windows'da Linux kapsayıcıları