dotnet publish ile bir .NET uygulamasını kapsayıcıya alma

Kapsayıcılar sabit bir altyapı olmak, taşınabilir mimari sağlamak ve ölçeklenebilirliği etkinleştirmek gibi birçok özellik ve avantaja sahiptir. Görüntü yerel geliştirme ortamınız, özel bulutunuz veya genel bulutunuz için kapsayıcılar oluşturmak için kullanılabilir. Bu öğreticide dotnet publish komutunu kullanarak bir .NET uygulamasını kapsayıcıya almayı öğreneceksiniz.

Önkoşullar

Aşağıdaki önkoşulları yükleyin:

Bu önkoşullara ek olarak, .NET'te Çalışan Hizmetleri hakkında bilgi sahibi olmanız önerilir.

.NET uygulaması oluşturma

Kapsayıcı oluşturmak için bir .NET uygulamasına ihtiyacınız vardır, bu nedenle şablondan yeni bir uygulama oluşturarak başlayın. Terminalinizi açın, henüz yapmadıysanız bir çalışma klasörü (sample-directory) oluşturun ve dizinleri içinde olacak şekilde değiştirin. Çalışan klasöründe aşağıdaki komutu çalıştırarak Çalışan adlı alt dizinde yeni bir proje oluşturun:

dotnet new worker -o Worker -n DotNet.ContainerImage

Klasör ağacınız aşağıdaki gibi görünür:

📁 sample-directory
    └──📂 Worker
        ├──appsettings.Development.json
        ├──appsettings.json
        ├──DotNet.ContainerImage.csproj
        ├──Program.cs
        ├──Worker.cs
        └──📂 obj
            ├── DotNet.ContainerImage.csproj.nuget.dgspec.json
            ├── DotNet.ContainerImage.csproj.nuget.g.props
            ├── DotNet.ContainerImage.csproj.nuget.g.targets
            ├── project.assets.json
            └── project.nuget.cache

Komutu Çalışan dotnet new adlı yeni bir klasör oluşturur ve çalıştırıldığında her saniye bir ileti günlüğe kaydeden bir çalışan hizmeti oluşturur. Terminal oturumunuzda dizinleri değiştirin ve Çalışan klasörüne gidin. dotnet run Uygulamayı başlatmak için komutunu kullanın.

dotnet run
Building...
info: DotNet.ContainerImage.Worker[0]
      Worker running at: 10/18/2022 08:56:00 -05:00
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: .\Worker
info: DotNet.ContainerImage.Worker[0]
      Worker running at: 10/18/2022 08:56:01 -05:00
info: DotNet.ContainerImage.Worker[0]
      Worker running at: 10/18/2022 08:56:02 -05:00
info: DotNet.ContainerImage.Worker[0]
      Worker running at: 10/18/2022 08:56:03 -05:00
info: Microsoft.Hosting.Lifetime[0]
      Application is shutting down...
Attempting to cancel the build...

Çalışan şablonu süresiz olarak döngü oluşturur. Durdurmak için Ctrl+C iptal komutunu kullanın.

NuGet paketi ekleme

Şu anda web dışı projeleri kapsayıcı olarak yayımlamak için Microsoft.NET.Build.Containers NuGet paketi gereklidir. NuGet paketini çalışan şablonuna eklemek Microsoft.NET.Build.Containers için aşağıdaki dotnet add package komutunu çalıştırın:

dotnet add package Microsoft.NET.Build.Containers

İpucu

Bir web uygulaması oluşturuyor ve .NET SDK 7.0.300 veya üzerini kullanıyorsanız, paket gerekli değildir; SDK aynı işlevselliği kullanıma sunar.

Kapsayıcı görüntüsü adını ayarlama

Bir uygulamayı kapsayıcı olarak yayımlarken kullanılabilecek çeşitli yapılandırma seçenekleri vardır.

Varsayılan olarak, kapsayıcı görüntüsü adı projenin adıdır AssemblyName . Bu ad kapsayıcı görüntüsü adı olarak geçersizse, aşağıdaki proje dosyasında gösterildiği gibi belirterek ContainerRepository geçersiz kılabilirsiniz:

<Project Sdk="Microsoft.NET.Sdk.Worker">

  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <UserSecretsId>dotnet-DotNet.ContainerImage-2e40c179-a00b-4cc9-9785-54266210b7eb</UserSecretsId>
    <ContainerRepository>dotnet-worker-image</ContainerRepository>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
  </ItemGroup>
</Project>

Daha fazla bilgi için bkz . ContainerRepository.

Varsayılan olarak, kapsayıcı görüntüsü adı projenin adıdır AssemblyName . Bu ad kapsayıcı görüntüsü adı olarak geçersizse, aşağıdaki proje dosyasında gösterildiği gibi bir (ContainerImageName eski) veya tercih edileni ContainerRepository belirterek geçersiz kılabilirsiniz:

<Project Sdk="Microsoft.NET.Sdk.Worker">

  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <UserSecretsId>dotnet-DotNet.ContainerImage-2e40c179-a00b-4cc9-9785-54266210b7eb</UserSecretsId>
    <ContainerImageName>dotnet-worker-image</ContainerImageName>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.1" />
    <PackageReference Include="Microsoft.NET.Build.Containers" Version="7.0.401" />
  </ItemGroup>
</Project>

Daha fazla bilgi için bkz . ContainerImageName.

.NET uygulamasını yayımlama

.NET uygulamasını kapsayıcı olarak yayımlamak için aşağıdaki dotnet publish komutunu kullanın:

dotnet publish --os linux --arch x64 /t:PublishContainer -c Release

Yukarıdaki .NET CLI komutu uygulamayı kapsayıcı olarak yayımlar:

  • Linux'u işletim sistemi--os linux () olarak hedefleme.
  • Bir x64 mimarisi (--arch x64) belirtme.
  • Yayın yapılandırmasını (-c Release) kullanma.

Önemli

Kapsayıcıyı yerel olarak oluşturmak için Docker daemon'unun çalışıyor olması gerekir. Uygulamayı kapsayıcı olarak yayımlamaya çalıştığınızda çalışmıyorsa aşağıdakine benzer bir hatayla karşılaşırsınız:

..\build\Microsoft.NET.Build.Containers.targets(66,9): error MSB4018:
   The "CreateNewImage" task failed unexpectedly. [..\Worker\DotNet.ContainerImage.csproj]

İpucu

Kapsayıcıya eklediğiniz uygulamanın türüne bağlı olarak, komut satırı anahtarları (seçenekler) farklılık gösterebilir. Örneğin, /t:PublishContainer bağımsız değişken yalnızca ve worker şablonları gibi console web dışı .NET uygulamaları için gereklidir. Web şablonları için bağımsız değişkenini /t:PublishContainer ile -p:PublishProfile=DefaultContainerdeğiştirin. Daha fazla bilgi için bkz . .NET SDK kapsayıcı derlemeleri, sorun #141.

komutu, örnek çıktıya benzer bir çıkış oluşturur:

Determining projects to restore...
  All projects are up-to-date for restore.
  DotNet.ContainerImage -> .\Worker\bin\Release\net8.0\linux-x64\DotNet.ContainerImage.dll
  DotNet.ContainerImage -> .\Worker\bin\Release\net8.0\linux-x64\publish\
  Building image 'dotnet-worker-image' with tags latest on top of base image mcr.microsoft.com/dotnet/aspnet:8.0
  Pushed container 'dotnet-worker-image:latest' to Docker daemon
Determining projects to restore...
  All projects are up-to-date for restore.
  DotNet.ContainerImage -> .\Worker\bin\Release\net7.0\linux-x64\DotNet.ContainerImage.dll
  DotNet.ContainerImage -> .\Worker\bin\Release\net7.0\linux-x64\publish\
  Building image 'dotnet-worker-image' with tags 1.0.0 on top of base image mcr.microsoft.com/dotnet/aspnet:7.0
  Pushed container 'dotnet-worker-image:1.0.0' to Docker daemon

Bu komut, çalışan uygulamanızı yayımlama klasörüne derler ve kapsayıcıyı yerel docker kayıt defterinize gönderir.

Kapsayıcı görüntüsünü yapılandırma

MSBuild özellikleri aracılığıyla oluşturulan kapsayıcının birçok yönünü denetleyebilirsiniz. Genel olarak, bazı yapılandırmaları ayarlamak için Dockerfile'da bir komut kullanabilirseniz, msbuild aracılığıyla da aynı işlemi yapabilirsiniz.

Not

Bunun tek özel durumları komutlardır RUN . Kapsayıcıların oluşturulma biçimi nedeniyle bunlar öykünemez. Bu işleve ihtiyacınız varsa kapsayıcı görüntülerinizi oluşturmak için bir Dockerfile kullanmanız gerekir.

ContainerArchiveOutputPath

.NET 8'den başlayarak kapsayıcıyı doğrudan tar.gz arşivi olarak oluşturabilirsiniz. Bu özellik, iş akışınız basit değilse ve örneğin resimlerinizi göndermeden önce bir tarama aracı çalıştırmanızı gerektiriyorsa kullanışlıdır. Arşiv oluşturulduktan sonra taşıyabilir, tarayabilir veya yerel bir Docker araç zincirine yükleyebilirsiniz.

Arşivde yayımlamak için komutunuza dotnet publish özelliğini ekleyinContainerArchiveOutputPath, örneğin:

dotnet publish \
  -p PublishProfile=DefaultContainer \
  -p ContainerArchiveOutputPath=./images/sdk-container-demo.tar.gz

Belirli bir dosya adına sahip bir klasör adı veya yol belirtebilirsiniz. Klasör adını belirtirseniz, görüntü arşiv dosyası için oluşturulan dosya adı olur $(ContainerRepository).tar.gz. Bu arşivler, yalnızca tümü ContainerImageTagsiçin tek bir dosya oluşturulduğu için içinde birden çok etiket içerebilir.

Kapsayıcı görüntüsü adlandırma yapılandırması

Kapsayıcı görüntüleri belirli bir adlandırma kuralına uyar. Görüntünün adı birkaç bölümden, kayıt defterinden, isteğe bağlı bağlantı noktasından, depodan ve isteğe bağlı etiket ve aileden oluşur.

REGISTRY[:PORT]/REPOSITORY[:TAG[-FAMILY]]

Örneğin, tam mcr.microsoft.com/dotnet/runtime:8.0-alpine görüntü adını göz önünde bulundurun:

  • mcr.microsoft.com kayıt defteridir (ve bu örnekte Microsoft kapsayıcı kayıt defterini temsil eder).
  • dotnet/runtime depodur (ancak bazıları bunu olarak kabul edecektir user/repository).
  • 8.0-alpine etiket ve ailedir (aile, işletim sisteminin paketlenmesine yardımcı olan isteğe bağlı bir tanımlayıcıdır).

Aşağıdaki bölümlerde açıklanan bazı özellikler, oluşturulan görüntü adının bölümlerini yönetmeye karşılık gelir. Görüntü adı ile derleme özellikleri arasındaki ilişkiyi eşleyen aşağıdaki tabloyu göz önünde bulundurun:

Resim adı bölümü MSBuild özelliği Örnek değerler
REGISTRY[:PORT] ContainerRegistry mcr.microsoft.com:443
PORT ContainerPort :443
REPOSITORY ContainerRepository dotnet/runtime
TAG ContainerImageTag 8.0
FAMILY ContainerFamily -alpine
Resim adı bölümü MSBuild özelliği Örnek değerler
REGISTRY[:PORT] ContainerRegistry mcr.microsoft.com:443
PORT ContainerPort :443
REPOSITORY ContainerImageName dotnet/runtime
TAG ContainerImageTag 8.0

Aşağıdaki bölümlerde, oluşturulan kapsayıcı görüntüsünü denetlemek için kullanılabilecek çeşitli özellikler açıklanmaktadır.

ContainerBaseImage

Kapsayıcı temel görüntüsü özelliği, görüntünüz için temel olarak kullanılan görüntüyü denetler. Varsayılan olarak, projenizin özelliklerine göre aşağıdaki değerler çıkarılır:

  • Projeniz kendi içindeyse, mcr.microsoft.com/dotnet/runtime-deps temel görüntü olarak görüntü kullanılır.
  • Projeniz bir ASP.NET Core projesiyse, mcr.microsoft.com/dotnet/aspnet resim temel görüntü olarak kullanılır.
  • mcr.microsoft.com/dotnet/runtime Aksi takdirde, görüntü temel görüntü olarak kullanılır.

Görüntünün etiketi, seçtiğiniz TargetFrameworköğesinin sayısal bileşeni olarak çıkarılır. Örneğin, bir proje hedeflemesi net6.0 , çıkarsanan temel görüntünün etiketine neden olur 6.0 ve bir net7.0-linux proje etiketi kullanır 7.0 ve bu şekilde devam edebilir.

Burada bir değer ayarlarsanız, tercih ettiğiniz herhangi bir etiket de dahil olmak üzere temel olarak kullanılacak görüntünün tam adını ayarlamanız gerekir:

<PropertyGroup>
    <ContainerBaseImage>mcr.microsoft.com/dotnet/runtime:8.0</ContainerBaseImage>
</PropertyGroup>
<PropertyGroup>
    <ContainerBaseImage>mcr.microsoft.com/dotnet/runtime:7.0</ContainerBaseImage>
</PropertyGroup>

ContainerFamily

.NET 8'den başlayarak, uygulamanızın ContainerFamily temel görüntüsü olarak Microsoft tarafından sağlanan farklı bir kapsayıcı görüntüsü ailesi seçmek için MSBuild özelliğini kullanabilirsiniz. Bu değer ayarlandığında, seçilen TFM'ye özgü etiketin sonuna eklenir ve sağlanan etiket değiştirilir. Örneğin, .NET temel görüntülerinin Alpine Linux değişkenlerini kullanmak için alpineolarak ayarlayabilirsinizContainerFamily:

<PropertyGroup>
    <ContainerFamily>alpine</ContainerFamily>
</PropertyGroup>

Yukarıdaki proje yapılandırması, .NET 8'i hedefleyen bir uygulama için son etiketine 8.0-alpine neden olur.

Bu alan serbest biçimlidir ve genellikle farklı işletim sistemi dağıtımlarını, varsayılan paket yapılandırmalarını veya temel görüntüdeki diğer değişiklikleri seçmek için kullanılabilir. Bu alan ayarlandığında yoksayılır ContainerBaseImage . Daha fazla bilgi için bkz . .NET kapsayıcı görüntüleri.

ContainerRuntimeIdentifier

Kapsayıcı çalışma zamanı tanımlayıcı özelliği, ContainerBaseImage'iniz birden fazla platformu destekliyorsa kapsayıcınız tarafından kullanılan işletim sistemini ve mimariyi denetler. Örneğin, mcr.microsoft.com/dotnet/runtime görüntü şu anda , ve win10-x64 görüntülerinin tümü aynı etiketin arkasındadırlinux-x64linux-armlinux-arm64, bu nedenle araç, bu sürümlerden hangisini kullanmayı düşündüğünüze ilişkin bir yönteme ihtiyaç duyar. Varsayılan olarak, kapsayıcıyı yayımladığınızda seçtiğiniz değerine RuntimeIdentifier ayarlanır. Bu özelliğin nadiren açıkça ayarlanması gerekir. Bunun yerine komutunun -rdotnet publish seçeneğini kullanın. Seçtiğiniz görüntü seçtiğiniz görüntüyü desteklemiyorsa RuntimeIdentifier , görüntünün desteklediği RuntimeIdentifiers'ı açıklayan bir hatayla sonuçlanır.

Bu özelliği kullanmak zorunda kalmamak için, her zaman etiketi de dahil olmak üzere özelliği tam resim adına ayarlayabilirsiniz ContainerBaseImage .

<PropertyGroup>
    <ContainerRuntimeIdentifier>linux-arm64</ContainerRuntimeIdentifier>
</PropertyGroup>

.NET tarafından desteklenen çalışma zamanı tanımlayıcıları hakkında daha fazla bilgi için bkz . RID kataloğu.

ContainerRegistry

Kapsayıcı kayıt defteri özelliği, yeni oluşturulan görüntünün gönderileceği hedef kayıt defterini denetler. Varsayılan olarak yerel Docker daemon'a gönderilir, ancak bir uzak kayıt defteri de belirtebilirsiniz. Kimlik doğrulaması gerektiren bir uzak kayıt defteri kullanırken, iyi bilinen docker login mekanizmaları kullanarak kimlik doğrulaması yaparsınız. Daha fazla bilgi için bkz . Daha fazla ayrıntı için kapsayıcı kayıt defterlerinde kimlik doğrulaması yapma. Bu özelliği kullanmanın somut bir örneği için aşağıdaki XML örneğini göz önünde bulundurun:

<PropertyGroup>
    <ContainerRegistry>registry.mycorp.com:1234</ContainerRegistry>
</PropertyGroup>

Bu araç, Docker Registry HTTP API V2'yi destekleyen herhangi bir kayıt defterinde yayımlamayı destekler. Bu, aşağıdaki kayıt defterlerini açıkça (ve büyük olasılıkla daha örtük olarak) içerir:

Bu kayıt defterleriyle çalışma hakkında notlar için kayıt defterine özgü notlara bakın.

ContainerRepository

Kapsayıcı deposu, görüntünün adıdır, örneğin veya dotnet/runtimemy-app. Varsayılan olarak, AssemblyName projenin değeri kullanılır.

<PropertyGroup>
    <ContainerRepository>my-app</ContainerRepository>
</PropertyGroup>

ContainerImageName

Kapsayıcı görüntüsü adı, dotnet/runtime örneğin veya my-appgörüntünün adını denetler. Varsayılan olarak, AssemblyName projenin değeri kullanılır.

<PropertyGroup>
    <ContainerImageName>my-app</ContainerImageName>
</PropertyGroup>

Not

.NET 8'den başlayarak, ContainerImageName yerine ContainerRepositorykullanım dışı bırakılmıştır.

Görüntü adları, her biri yalnızca küçük harfli alfasayısal karakterler, nokta, alt çizgi ve tire içerebilen ve harf veya sayı ile başlaması gereken bir veya daha fazla eğik çizgiyle ayrılmış kesimden oluşur. Diğer karakterler hatayla sonuçlanır.

ContainerImageTag(s)

Kapsayıcı görüntüsü etiketi özelliği, görüntü için oluşturulan etiketleri denetler. Tek bir etiket kullanımı ContainerImageTag belirtmek için ve birden çok etiket için kullanın ContainerImageTags.

Önemli

kullandığınızda ContainerImageTags, benzersiz etiket başına bir tane olan birden çok görüntüyle sonuç alırsınız.

Etiketler genellikle bir uygulamanın farklı sürümlerine başvurmak için kullanılır, ancak farklı işletim sistemi dağıtımlarına, hatta farklı yapılandırmalara da başvurabilir.

.NET 8'den başlayarak, bir etiket sağlanmayan varsayılan değerdir latest.

Varsayılan olarak, Version projenin etiketi değeri olarak kullanılır.

Varsayılanı geçersiz kılmak için aşağıdakilerden birini belirtin:

<PropertyGroup>
    <ContainerImageTag>1.2.3-alpha2</ContainerImageTag>
</PropertyGroup>

Birden çok etiket belirtmek için özelliğinde ContainerImageTags birden çok TargetFrameworksayarına benzer şekilde noktalı virgülle ayrılmış bir etiket kümesi kullanın:

<PropertyGroup>
    <ContainerImageTags>1.2.3-alpha2;latest</ContainerImageTags>
</PropertyGroup>

Etiketler en fazla 127 alfasayısal karakter, nokta, alt çizgi ve tire içerebilir. Alfasayısal karakter veya alt çizgi ile başlamalıdır. Diğer formlar bir hatanın oluşmasına neden olur.

Not

kullanılırken ContainerImageTags, etiketler bir ; karakterle sınırlandırılır. Komut satırından (çoğu CI/CD ortamlarında olduğu gibi) çağrı dotnet publish yapıyorsanız, değerleri tek ' ve iç kaydırmada çift tırnak "(örneğin='"tag-1;tag-2"') ile dışlamanız gerekir. Aşağıdaki dotnet publish komutu göz önünde bulundurun:

dotnet publish -p ContainerImageTags='"1.2.3-alpha2;latest"'

Bu, iki görüntünün oluşturulmasına neden olur: my-app:1.2.3-alpha2 ve my-app:latest.

İpucu

özelliğiyle ilgili sorunlarla ContainerImageTags karşılaşırsanız bunun yerine bir ortam değişkeninin ContainerImageTags kapsamını belirlemeyi göz önünde bulundurun:

ContainerImageTags='1.2.3;latest' dotnet publish

ContainerLabel

Kapsayıcı etiketi kapsayıcıya bir meta veri etiketi ekler. Etiketler çalışma zamanında kapsayıcıyı etkilemez, ancak genellikle güvenlik tarayıcıları ve diğer altyapı araçları tarafından kullanılmak üzere sürüm ve yazma meta verilerini depolamak için kullanılır. İstediğiniz sayıda kapsayıcı etiketi belirtebilirsiniz.

Düğümün ContainerLabel iki özniteliği vardır:

  • Include: Etiketin anahtarı.
  • Value: Etiketin değeri (bu boş olabilir).
<ItemGroup>
    <ContainerLabel Include="org.contoso.businessunit" Value="contoso-university" />
</ItemGroup>

Varsayılan olarak oluşturulan etiketlerin listesi için bkz . varsayılan kapsayıcı etiketleri.

Kapsayıcı yürütmeyi yapılandırma

Kapsayıcının yürütülmesini denetlemek için aşağıdaki MSBuild özelliklerini kullanabilirsiniz.

ContainerWorkingDirectory

Kapsayıcı çalışma dizini düğümü, kapsayıcının çalışma dizinini denetler; başka komut çalıştırılmazsa komutların içinde yürütülür.

Varsayılan olarak, /app dizin değeri çalışma dizini olarak kullanılır.

<PropertyGroup>
    <ContainerWorkingDirectory>/bin</ContainerWorkingDirectory>
</PropertyGroup>

ContainerPort

Kapsayıcı bağlantı noktası, kapsayıcı için bilinen bağlantı noktaları listesine TCP veya UDP bağlantı noktaları ekler. Bu, Docker gibi kapsayıcı çalışma zamanlarının bu bağlantı noktalarını otomatik olarak konak makinesine eşlemesini sağlar. Bu genellikle kapsayıcı için belge olarak kullanılır, ancak otomatik bağlantı noktası eşlemesini etkinleştirmek için de kullanılabilir.

Düğümün ContainerPort iki özniteliği vardır:

  • Include: Kullanıma sunma bağlantı noktası numarası.
  • Type: varsayılan olarak tcp, geçerli değerler veya tcpudpşeklindedir.
<ItemGroup>
    <ContainerPort Include="80" Type="tcp" />
</ItemGroup>

.NET 8'den başlayarak, ContainerPort iyi bilinen birkaç ASP.NET ortam değişkenine göre açıkça sağlanmadığında çıkarılır:

  • ASPNETCORE_URLS
  • ASPNETCORE_HTTP_PORTS
  • ASPNETCORE_HTTPS_PORTS

Bu ortam değişkenleri varsa, değerleri ayrıştırılır ve TCP bağlantı noktası eşlemelerine dönüştürülür. Bu ortam değişkenleri, varsa temel görüntünüzden veya öğeler aracılığıyla ContainerEnvironmentVariable projenizde tanımlanan ortam değişkenlerinden okunur. Daha fazla bilgi için bkz . ContainerEnvironmentVariable.

ContainerEnvironmentVariable

Kapsayıcı ortam değişkeni düğümü, kapsayıcıya ortam değişkenleri eklemenize olanak tanır. Ortam değişkenleri kapsayıcıda çalışan uygulama tarafından hemen erişilebilir ve genellikle çalışan uygulamanın çalışma zamanı davranışını değiştirmek için kullanılır.

Düğümün ContainerEnvironmentVariable iki özniteliği vardır:

  • Include: Ortam değişkeninin adı.
  • Value: Ortam değişkeninin değeri.
<ItemGroup>
  <ContainerEnvironmentVariable Include="LOGGER_VERBOSITY" Value="Trace" />
</ItemGroup>

Daha fazla bilgi için bkz . .NET ortam değişkenleri.

Kapsayıcı komutlarını yapılandırma

Varsayılan olarak, kapsayıcı araçları uygulamanız için oluşturulan AppHost ikili dosyasını (uygulamanız bir AppHost kullanıyorsa) veya komutu ve uygulamanızın DLL'sini dotnet kullanarak uygulamanızı başlatır.

Ancak, , , ContainerDefaultArgsve ContainerAppCommandInstructionbirleşimlerini kullanarak uygulamanızın ContainerAppCommandContainerAppCommandArgsnasıl yürütülebileceğini denetleyebilirsiniz.

Farklı temel görüntüler kapsayıcının ENTRYPOINT ve özelliklerin farklı bileşimlerini kullandığından ve COMMAND bunların tümünü destekleyebilmek istediğinizden bu farklı yapılandırma noktaları vardır. Varsayılanlar çoğu uygulama için kullanılabilir olmalıdır, ancak uygulama başlatma davranışınızı özelleştirmek istiyorsanız şunları yapmalısınız:

  • Çalıştırılacak ikiliyi belirleyin ve olarak ayarlayın ContainerAppCommand
  • Uygulamanızın çalışması için hangi bağımsız değişkenlerin gerekli olduğunu belirleyin ve bunları olarak ayarlayınContainerAppCommandArgs
  • Hangi bağımsız değişkenlerin (varsa) isteğe bağlı olduğunu ve bir kullanıcı tarafından geçersiz kılınabileceğini belirleyin ve bunları olarak ayarlayınContainerDefaultArgs
  • ContainerAppCommandInstruction seçeneğini DefaultArgs olarak ayarlayın

Daha fazla bilgi için aşağıdaki yapılandırma öğelerine bakın.

ContainerAppCommand

Uygulama komut yapılandırma öğesi, uygulamanızın mantıksal giriş noktasıdır. Çoğu uygulama için bu AppHost, uygulamanız için oluşturulan yürütülebilir ikili dosyadır. Uygulamanız bir AppHost oluşturmazsa, bu komut genellikle olur dotnet <your project dll>. Bu değerler, temel kapsayıcınızdaki herhangi bir ENTRYPOINT değerden sonra veya tanımlanmadıysa ENTRYPOINT doğrudan uygulanır.

Yapılandırma, ContainerAppCommand giriş noktası komutunda kullanılacak komutu, seçeneği veya bağımsız değişkeni temsil eden tek Include bir özelliğe sahiptir:

<ItemGroup Label="ContainerAppCommand Assignment">
  <!-- This is how you would start the dotnet ef tool in your container -->
  <ContainerAppCommand Include="dotnet" />
  <ContainerAppCommand Include="ef" />

  <!-- This shorthand syntax means the same thing, note the semicolon separating the tokens. -->
  <ContainerAppCommand Include="dotnet;ef" />
</ItemGroup>

ContainerAppCommandArgs

Bu uygulama komutu args yapılandırma öğesi, uygulamanız için mantıksal olarak gerekli olan ve uygulamasına ContainerAppCommanduygulanması gereken bağımsız değişkenleri temsil eder. Varsayılan olarak, bir uygulama için hiçbiri oluşturulmaz. Mevcut olduğunda, bağımsız değişkenler çalıştırıldığında kapsayıcınıza uygulanır.

Yapılandırma, ContainerAppCommandArgs komuta uygulanacak ContainerAppCommand seçeneği veya bağımsız değişkeni temsil eden tek Include bir özelliğe sahiptir.

<ItemGroup>
  <!-- Assuming the ContainerAppCommand defined above, 
       this would be the way to force the database to update.
  -->
  <ContainerAppCommandArgs Include="database" />
  <ContainerAppCommandArgs Include="update" />

  <!-- This is the shorthand syntax for the same idea -->
  <ContainerAppCommandArgs Include="database;update" />
</ItemGroup>

ContainerDefaultArgs

Bu varsayılan bağımsız yapılandırma öğesi, uygulamanız için kullanıcı tarafından geçersiz kılınabilir bağımsız değişkenleri temsil eder. Bu, uygulamanızın başlatmayı ve yine de özelleştirmeyi kolaylaştıran bir şekilde çalışması gerekebilecek varsayılan değerler sağlamanın iyi bir yoludur.

Yapılandırma, ContainerDefaultArgs komuta uygulanacak ContainerAppCommand seçeneği veya bağımsız değişkeni temsil eden tek Include bir özelliğe sahiptir.

<ItemGroup>
  <!-- Assuming the ContainerAppCommand defined above, 
       this would be the way to force the database to update.
  -->
  <ContainerDefaultArgs Include="database" />
  <ContainerDefaultArgs Include="update" />

  <!-- This is the shorthand syntax for the same idea -->
  <ContainerDefaultArgs Include="database;update" />
</ItemGroup>

ContainerAppCommandInstruction

Uygulama komut yönerge yapılandırması, kapsayıcıda ContainerEntrypointçalıştırılan son komutu oluşturmak için , ContainerEntrypointArgs, ContainerAppCommand, , ContainerAppCommandArgsve ContainerDefaultArgs komutlarının nasıl birleştirildiğini denetlemeye yardımcı olur. Bu, temel görüntüde bir ENTRYPOINT olup olmadığını büyük ölçüde bağlıdır. Bu özellik üç değerden birini alır: "DefaultArgs", "Entrypoint", veya "None".

  • Entrypoint:
    • Bu modda, giriş noktası , ContainerAppCommandArgsve ContainerDefaultArgstarafından ContainerAppCommandtanımlanır.
  • None:
    • Bu modda, giriş noktası , ContainerEntrypointArgsve ContainerDefaultArgstarafından ContainerEntrypointtanımlanır.
  • DefaultArgs:
    • Bu en karmaşık moddur; öğelerden ContainerEntrypoint[Args] hiçbiri mevcut değilse ve, ContainerAppCommand[Args]ContainerDefaultArgs giriş noktası ve komutu oluşturmak için kullanılır. Sabit kodlanmış dotnet veya /usr/bin/dotnet tam denetime sahip olmak için atlanan temel görüntülerin temel görüntü giriş noktası.
    • Hem hem ContainerAppCommand de ContainerEntrypoint varsa, ContainerEntrypoint giriş noktası olur ve ContainerAppCommand komut olur.

Not

ContainerEntrypoint ve ContainerEntrypointArgs yapılandırma öğeleri .NET 8 itibarıyla kullanım dışı bırakılmıştır.

Önemli

Bu, kullanıcıların çoğuna yönelik gelişmiş uygulamaların giriş noktalarını bu dereceye kadar özelleştirmesi gerekmemelidir. Daha fazla bilgi için ve senaryolarınız için kullanım örnekleri sağlamak istiyorsanız bkz . GitHub: .NET SDK kapsayıcı derleme tartışmaları.

ContainerUser

Kullanıcı yapılandırma özelliği, kapsayıcının çalıştığı varsayılan kullanıcıyı denetler. Bu genellikle kapsayıcıyı kök olmayan bir kullanıcı olarak çalıştırmak için kullanılır. Bu, güvenlik için en iyi yöntemdir. Bu yapılandırmanın dikkate alınması gereken birkaç kısıtlama vardır:

  • Kullanıcı adı, linux kullanıcı kimlikleri, grup adı, linux grup kimliği username:groupnameve diğer kimlik varyantları gibi çeşitli formlar alabilir.
  • Belirtilen kullanıcının veya grubun görüntüde var olduğuna dair bir doğrulama yoktur.
  • Kullanıcının değiştirilmesi, özellikle Dosya Sistemi izinleri gibi konularda uygulamanın davranışını değiştirebilir.

Bu alanın varsayılan değeri proje TFM'sine ve hedef işletim sistemine göre değişir:

  • .NET 8 veya üzerini hedefleyip Microsoft çalışma zamanı görüntülerini kullanıyorsanız:
    • Linux'ta köksüz kullanıcı app kullanılır (kullanıcı kimliği tarafından başvurulsa da)
    • Windows'ta köksüz kullanıcı ContainerUser kullanılır
  • Aksi takdirde varsayılan ContainerUser kullanılmaz
<PropertyGroup>
  <ContainerUser>my-existing-app-user</ContainerUser>
</PropertyGroup>

İpucu

Ortam APP_UID değişkeni, kapsayıcınızdaki kullanıcı bilgilerini ayarlamak için kullanılır. Bu değer, temel görüntünüzde tanımlanan ortam değişkenlerinden gelebilir (Microsoft .NET görüntülerinin yaptığı gibi) veya söz dizimi aracılığıyla ContainerEnvironmentVariable kendiniz ayarlayabilirsiniz.

Ancak ve ContainerEntrypointArgskullanarak ContainerEntrypoint uygulamanızın nasıl yürütülebileceğini denetleyebilirsiniz.

ContainerEntrypoint

Kapsayıcı giriş noktası, kapsayıcı başlatıldığında çağrılan yürütülebilir dosya olan kapsayıcının özelleştirmek ENTRYPOINT için kullanılabilir. Varsayılan olarak, uygulama konağı oluşturan derlemeler için olarak ContainerEntrypointayarlanır. Yürütülebilir dosya oluşturmayan derlemeler için olarak dotnet path/to/app.dll kullanılır ContainerEntrypoint.

Düğümün ContainerEntrypoint tek bir özniteliği vardır:

  • Include: Komutta ContainerEntrypoint kullanılacak komut, seçenek veya bağımsız değişken.

Örneğin, aşağıdaki örnek .NET proje öğesi grubunu göz önünde bulundurun:

<ItemGroup Label="Entrypoint Assignment">
  <!-- This is how you would start the dotnet ef tool in your container -->
  <ContainerEntrypoint Include="dotnet" />
  <ContainerEntrypoint Include="ef" />

  <!-- This shorthand syntax means the same thing.
       Note the semicolon separating the tokens. -->
  <ContainerEntrypoint Include="dotnet;ef" />
</ItemGroup>

ContainerEntrypointArgs

Kapsayıcı giriş noktası args düğümü, öğesine ContainerEntrypointsağlanan varsayılan bağımsız değişkenleri denetler. Bu, kullanıcının kendi başına kullanmak isteyebileceği bir program olduğunda ContainerEntrypoint kullanılmalıdır. Varsayılan olarak, sizin yerinize hiçbir şey ContainerEntrypointArgs oluşturulmaz.

Düğümün ContainerEntrypointArg tek bir özniteliği vardır:

  • Include: Komuta uygulanacak ContainerEntrypoint seçenek veya bağımsız değişken.

Aşağıdaki örnek .NET proje öğesi grubunu göz önünde bulundurun:

<ItemGroup>
  <!-- Assuming the ContainerEntrypoint defined above,
       this would be the way to update the database by
       default, but let the user run a different EF command. -->
  <ContainerEntrypointArgs Include="database" />
  <ContainerEntrypointArgs Include="update" />

  <!-- This is the shorthand syntax for the same idea -->
  <ContainerEntrypointArgs Include="database;update" />
</ItemGroup>

Varsayılan kapsayıcı etiketleri

Etiketler genellikle kapsayıcı görüntülerinde tutarlı meta veriler sağlamak için kullanılır. Bu paket, oluşturulan görüntülerin daha iyi korunabilmesini teşvik etmek için bazı varsayılan etiketler sağlar.

  • org.opencontainers.image.created geçerli UTC'nin DateTimeISO 8601 biçimine ayarlanır.

Daha fazla bilgi için bkz . Mevcut etiket altyapısının üzerine geleneksel etiketler uygulama.

Kaynakları temizleme

Bu makalede, kapsayıcı görüntüsü olarak bir .NET çalışanı yayımladınız. İsterseniz bu kaynağı silin. Yüklü görüntülerin docker images listesini görmek için komutunu kullanın.

docker images

Aşağıdaki örnek çıkışı göz önünde bulundurun:

REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
dotnet-worker-image   1.0.0     25aeb97a2e21   12 seconds ago   191MB

İpucu

Görüntü dosyaları büyük olabilir. Genellikle uygulamanızı test ederken ve geliştirirken oluşturduğunuz geçici kapsayıcıları kaldırırsınız. Bu çalışma zamanını temel alan başka görüntüler derlemeyi planlıyorsanız, genellikle temel görüntüleri çalışma zamanı yüklü olarak tutarsınız.

Görüntüyü silmek için görüntü kimliğini kopyalayın ve komutunu çalıştırın docker image rm :

docker image rm 25aeb97a2e21

Sonraki adımlar