Aracılığıyla paylaş


.NET uygulama başvurularını kapsayıcıya alma

Bu başvuru makalesinde, bir .NET uygulamasını kapsayıcı olarak yayımladığınızda oluşturulan kapsayıcı görüntüsünü yapılandırmayı öğreneceksiniz. Bu makale, görüntüyü, yürütme ortamını ve kapsayıcı başlatıldığında çalıştırılacak komutları denetlemek için ayarlayabileceğiniz çeşitli özellikleri kapsar.

Kapsayıcı özelliklerini 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ı RUN komutlarıdır. Kapsayıcıların oluşturulma biçimi nedeniyle bu komutlar öykünemez. Bu işleve ihtiyacınız varsa kapsayıcı görüntülerinizi oluşturmak için dockerfile kullanmayı göz önünde bulundurun.

.NET SDK ile RUN komutları gerçekleştirmenin hiçbir yolu yoktur. Bu komutlar genellikle bazı işletim sistemi paketlerini yüklemek veya yeni bir işletim sistemi kullanıcısı ya da herhangi bir sayıda rastgele şey oluşturmak için kullanılır. .NET SDK kapsayıcı oluşturma özelliğini kullanmaya devam etmek isterseniz, bunun yerine bu değişikliklerle özel bir temel görüntü oluşturabilir ve ardından bu temel görüntüyü kullanabilirsiniz. Daha fazla bilgi için bkz. ContainerBaseImage.

Temel görüntüyü denetleen bayraklar

Aşağıdaki özellikler kapsayıcınız için hangi temel görüntünün kullanılacağını ve nasıl seçildiğini denetler:

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, temel görüntü olarak mcr.microsoft.com/dotnet/runtime-deps görüntüsü kullanılır.
  • Projeniz bir ASP.NET Core projesiyse, temel görüntü olarak mcr.microsoft.com/dotnet/aspnet görüntüsü kullanılır.
  • Aksi takdirde mcr.microsoft.com/dotnet/runtime görüntüsü temel görüntü olarak kullanılır.

Görüntünün etiketi, seçtiğiniz TargetFrameworksayısal bileşeni olarak çıkarılır. Örneğin, net6.0 hedefleyen bir proje, çıkarsanan temel görüntünün 6.0 etiketine neden olur ve net7.0-linux bir proje 7.0 etiketini kullanır vb.

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>

.NET SDK sürüm 8.0.200 ile, boyutu ve güvenliği iyileştirmek için ContainerBaseImage çıkarımı iyileştirilir:

  • linux-musl-x64 veya linux-musl-arm64 Çalışma Zamanı Tanımlayıcılarını hedeflemek, projenizin çalıştığından emin olmak için alpine görüntü değişkenlerini otomatik olarak seçer:
    • Proje PublishAot=true kullanıyorsa en iyi boyut ve güvenlik için temel görüntünün nightly/runtime-depsjammy-chiseled-aot değişkeni.
    • Proje InvariantGlobalization=false kullanıyorsa, yerelleştirmenin hala çalıştığından emin olmak için -extra değişkenleri kullanılır.

Görüntü değişkenlerinin boyutları ve özellikleri hakkında daha fazla bilgi için bkz. .NET 8.0 Kapsayıcı Görüntüsü Boyutu Raporu.

ContainerFamily

.NET 8'den başlayarak ContainerFamily MSBuild özelliğini kullanarak uygulamanızın temel görüntüsü olarak Microsoft tarafından sağlanan farklı kapsayıcı görüntüleri ailesini seçebilirsiniz. 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 ContainerFamilyalpineolarak ayarlayabilirsiniz:

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

Yukarıdaki proje yapılandırması, .NET 8'i hedefleyen bir uygulama için son 8.0-alpine etiketine 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. ContainerBaseImage ayarlandığında bu alan yoksayılır. Daha fazla bilgi için bkz. .NET kapsayıcı görüntülerini.

ContainerRuntimeIdentifier(s)

ContainerRuntimeIdentifier özelliği, ContainerBaseImage birden çok platformu destekliyorsa kapsayıcınızın işletim sistemini ve mimarisini belirtir. Örneğin, mcr.microsoft.com/dotnet/runtime görüntüsü linux-x64, linux-arm, linux-arm64ve win10-x64destekler. Varsayılan olarak, kapsayıcı yayımlanırken kullanılan RuntimeIdentifier ayarlanır. Genellikle bu özelliği açıkça ayarlamanız gerekmez; bunun yerine, -r komutuyla dotnet publish seçeneğini kullanın. Seçilen görüntü belirtilen RuntimeIdentifierdesteklemiyorsa, desteklenen tanımlayıcıları bir hata gösterir.

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

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

Çok mimarili görüntüler için birden çok kapsayıcı çalışma zamanı tanımlayıcısı belirtmek için, ContainerRuntimeIdentifiers özelliğinde birden çok TargetFrameworksayarlamaya benzer şekilde noktalı virgülle ayrılmış bir çalışma zamanı tanımlayıcısı kümesi kullanın:

<PropertyGroup>
    <ContainerRuntimeIdentifiers>linux-x64;linux-arm64</ContainerRuntimeIdentifiers>
</PropertyGroup>

Önemli

özelliği, ContainerRuntimeIdentifiers özelliğin RuntimeIdentifiers bir alt kümesi olmalıdır. Bu koşul karşılanmazsa derleme işlem hattının kritik bölümleri başarısız olabilir.

Oluşturulan çok mimarili görüntüde birden çok ContainerRuntimeIdentifiers sonuç ayarlama. Daha fazla bilgi için bkz. Çok mimarili görüntüler.

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

Çok mimarili görüntüler

Çok mimarili görüntüler, tek bir kapsayıcı görüntüsünün birden çok mimariyi desteklemesini sağlayarak platformlar arası geliştirme ve dağıtımı basitleştirir. .NET SDK özelliği aracılığıyla ContainerRuntimeIdentifiers bunu destekler.

SDK 8.0.405, 9.0.102 ve 9.0.2xx sürümlerinden başlayarak çoklu RID kapsayıcı yayımlama desteklenir. ile /t:PublishContaineryayımlarken:

  • Tek RuntimeIdentifier veya ContainerRuntimeIdentifier belirtilirse, daha önce olduğu gibi tek mimarili bir kapsayıcı oluşturulur.
  • Tek bir belirtilmemişse RuntimeIdentifier ancak birden çok RuntimeIdentifiers veya ContainerRuntimeIdentifiers ayarlanmışsa SDK, belirtilen her RID için uygulamayı yayımlar ve sonuçta elde edilen görüntüleri bir OCI Görüntü Dizininde birleştirir. Bu dizin, mimariye özgü birden çok görüntünün tek bir adı paylaşmasına olanak tanır.

Not

özelliği, ContainerRuntimeIdentifiers özelliğin RuntimeIdentifiers bir alt kümesi olmalıdır. Daha fazla bilgi için bkz . ContainerRuntimeIdentifiers.

Bu özellik, karma mimari ortamlarında kapsayıcı iş akışlarını kolaylaştırır. Örneğin, bir linux-x64 konak üzerindeki bir geliştirici hem hem linux-x64de linux-arm64 destekleyen bir kapsayıcı yayımlayabilir ve görüntü adlarını veya etiketleri değiştirmeden mimariye dağıtımı etkinleştirebilir.

Oluşturulan OCI Görüntü Dizini, modern kapsayıcı araçlarıyla yaygın olarak desteklenir ve uyumluluk ve kullanım kolaylığını artırır.

Oluşturulan görüntüden bağımsız meta verileri denetleen bayraklar

Aşağıdaki özellikler, hedef çalışma zamanı tanımlayıcısına bakılmaksızın oluşturulan kapsayıcı görüntüsüne uygulanan meta verileri ve yapılandırmayı denetler:

ContainerImageFormat

GÖRÜNTÜ biçimini veya ContainerImageFormatolarak Docker belirtmek için MSBuild özelliğini kullanabilirsinizOCI. Varsayılan olarak, .NET aracı biçimi temel görüntüden çıkartır. Örneğin, .NET temel görüntüleri Docker'a özgü biçimini application/vnd.docker.distribution.manifest.v2+jsonkullanır. Ancak, birçok modern araç OCI biçimini application/vnd.oci.image.manifest.v1+jsontercih eder. Belirli bir biçimi zorlamak için özelliğini gösterildiği gibi ayarlayın:

<PropertyGroup>
  <ContainerImageFormat>OCI</ContainerImageFormat>
</PropertyGroup>

Her iki biçim de bilgi kaybı olmadan büyük ölçüde değiştirilebilir.

Not

Çok mimarili bir görüntü oluştururken, sonuçta elde edilen görüntü biçimi her zaman OCI'dir.

ContainerImageTag

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

Ö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ğer latest.

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

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

Birden çok etiket belirtmek için, ContainerImageTags özelliğinde birden çok TargetFrameworksayarlamaya 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

veya -sınırlandırılmış değerler gerektiren ContainerImageTagsherhangi bir MSBuild özelliği kullanırken;, özellikle CI/CD ortamlarında komut satırından çağrı dotnet publish yaparken doğru kaçış olduğundan emin olun. Kaçış kuralları PowerShell ile Bash arasında farklılık gösterir. Örneğin:

dotnet publish --os linux --arch x64 /t:PublishContainer /p:ContainerImageTags=`"1.2.3-alpha2`;latest`"

PowerShell'de hem ; hem de " karakterlerinin kaçış karakteri olması gerekir.

dotnet publish --os linux --arch x64 /t:PublishContainer /p:ContainerImageTags='"1.2.3-alpha2;latest"'

Bash'te yalnızca " karakterinin kaçılması gerekir.

Bunun sonucunda iki görüntü oluşturulur: my-app:1.2.3-alpha2 ve my-app:latest.

Bahşiş

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

$Env:ContainerImageTags='1.2.3;latest'; dotnet publish --os linux --arch x64 /t:PublishContainer

ContainerLabel

Kapsayıcı etiketi kapsayıcıya bir meta veri etiketi ekler. Etiketler 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.

ContainerLabel düğümünde iki öznitelik 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 .

ContainerRepository

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

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

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.

Yürütme meta verilerini denetleen bayraklar

Aşağıdaki özellikler çalışma zamanına özgü yürütme davranışını ve çok mimarili görüntü oluşturmayı denetler:

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şturmuyorsa, bu komut genellikle dotnet <your project dll>. Bu değerler, temel kapsayıcınızdaki herhangi bir ENTRYPOINT sonra veya doğrudan ENTRYPOINT tanımlanmadıysa uygulanır.

ContainerAppCommand yapılandırması, entrypoint komutunda kullanılacak komutu, seçeneği veya bağımsız değişkeni temsil eden tek bir Include özelliğine 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 ContainerAppCommanduygulanması gereken mantıksal olarak gerekli 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.

ContainerAppCommandArgs yapılandırması, Include komutuna uygulanacak seçeneği veya bağımsız değişkeni temsil eden tek bir ContainerAppCommand özelliğine 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>

ContainerAppCommandInstruction

Uygulama komut yönerge yapılandırması, kapsayıcıda çalıştırılan son komutu oluşturmak için ContainerEntrypoint, ContainerEntrypointArgs, ContainerAppCommand, ContainerAppCommandArgsve ContainerDefaultArgs birleştirilerek 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ı ContainerAppCommand, ContainerAppCommandArgsve ContainerDefaultArgstarafından tanımlanır.
  • None:
    • Bu modda, giriş noktası ContainerEntrypoint, ContainerEntrypointArgsve ContainerDefaultArgstarafından tanımlanır.
  • DefaultArgs:
    • Bu en karmaşık moddur; ContainerEntrypoint[Args] öğelerden hiçbiri yoksa, giriş noktası ve komutu oluşturmak için ContainerAppCommand[Args] ve ContainerDefaultArgs kullanılır. dotnet veya /usr/bin/dotnet sabit kodlanmış temel görüntülerin temel görüntü giriş noktası atlanır, böylece tam denetime sahip olursunuz.
    • Hem ContainerEntrypoint hem de ContainerAppCommand varsa, ContainerEntrypoint giriş noktası olur ve ContainerAppCommand komut olur.

Not

ContainerEntrypoint ve ContainerEntrypointArgs yapılandırma öğeleri .NET 8 itibarıyla kullanım dışıdı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ı.

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.

ContainerDefaultArgs yapılandırması, Include komutuna uygulanacak seçeneği veya bağımsız değişkeni temsil eden tek bir ContainerAppCommand özelliğine 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>

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.

ContainerEnvironmentVariable düğümünde iki öznitelik 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şkenlerini.

Not

Şu anda kapsayıcı görüntüsü yayımlarken .NET CLI'dan ortam değişkenlerini ayarlamak mümkün değildir. Daha fazla bilgi için bkz . GitHub: .NET SDK kapsayıcı derlemeleri.

ContainerPort

Kapsayıcı bağlantı noktası, kapsayıcı için bilinen bağlantı noktaları listesine İletim Denetimi Protokolü (TCP) veya Kullanıcı Veri Birimi Protokolü (UDP) bağlantı noktalarını 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.

ContainerPort düğümünde iki öznitelik vardır:

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

.NET 8'den başlayarak, ContainerPort, birçok iyi bilinen 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 projenizde tanımlanan ortam değişkenlerinden ContainerEnvironmentVariable öğeler aracılığıyla okunur. Daha fazla bilgi için bkz. ContainerEnvironmentVariable.

ContainerPublishInParallel

Çoklu RID kapsayıcıları için, bazı proje türleri (Blazor WebAssembly gibi) derleme yarış koşullarıyla karşılaşabilir. Bu sorunu çözmek için.NET SDK'sı 8.0.408, 9.0.300 ve 10.0 sürümlerinden başlayarak, özelliğini kullanarak ContainerPublishInParallel yayımlama işleminin paralelliğini denetleyebilirsiniz. Varsayılan olarak, yayımlama her Çalışma Zamanı Tanımlayıcısı (RID) için paralel olarak gerçekleşir. Bu özelliğin sıralı yayımlamayı sağlayacak şekilde false ayarlanması kararlılığı artırır ancak daha uzun sürebilir.

<PropertyGroup>
  <ContainerPublishInParallel>false</ContainerPublishInParallel>
</PropertyGroup>

Çoklu RID yayımlama hakkında daha fazla bilgi için bkz. ContainerRuntimeIdentifier(lar).

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>

Bahşiş

APP_UID ortam 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 (Microsoft .NET görüntülerinin yaptığı gibi) gelebilir veya ContainerEnvironmentVariable söz dizimi aracılığıyla kendiniz ayarlayabilirsiniz.

Uygulamanızı kök kullanıcı olarak çalışacak şekilde yapılandırmak için ContainerUser özelliğini rootolarak ayarlayın. Proje dosyanıza aşağıdakileri ekleyin:

<PropertyGroup>
  <ContainerUser>root</ContainerUser>
</PropertyGroup>

Alternatif olarak, komut satırından dotnet publish çağırırken bu değeri ayarlayabilirsiniz:

dotnet publish -p ContainerUser=root

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, çalışma dizini olarak /app dizin değeri kullanılır.

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

Oluşturulan görüntünün hedefini denetleen bayraklar

Aşağıdaki özellikler, oluşturulan kapsayıcı görüntüsünün nerede depolandığını veya yayımlandığını denetler:

ContainerArchiveOutputPath

tar.gz arşivinde kapsayıcı görüntüsü oluşturmak için özelliğini kullanınContainerArchiveOutputPath. 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 ContainerArchiveOutputPath özelliğini dotnet publish komutunuza ekleyin, ö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ı $(ContainerRepository).tar.gzolarak adlandırılır. Bu arşivler, yalnızca tüm ContainerImageTagsiçin tek bir dosya oluşturulduğu için içinde birden çok etiket içerebilir.

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ını kullanarak kimlik doğrulaması yaparsınız. Daha fazla bilgi için bkz. Kapsayıcı kayıt defterlerinde kimlik doğrulaması daha fazla ayrıntı için. 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:

  • Azure Container Registry
  • Amazon Elastic Container Registry
  • Google Artifact Registry
  • Docker Hub
  • GitHub Packages
  • GitLab tarafından barındırılan Container Registry
  • Quay.io

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

LocalRegistry

LocalRegistry MSBuild özelliği, yerel kaynaklara gönderilirken kullanılacak yerel kapsayıcı araçlarını belirtir. Desteklenen değerler docker ve podman. Ayarlanmadıysa SDK, aracı kullanılabilirliğe göre belirler:

  • Hem hem docker de podman varsa ve docker için podmanpodman bir diğer adsa kullanılır.
  • Yalnızca docker varsa kullanılır docker .
  • Yalnızca podman varsa kullanılır podman .
  • Hiçbiri yoksa bir hata oluşur.

Yerel kayıt defteri aracını açıkça ayarlamak için aşağıdaki yapılandırmayı kullanın:

<PropertyGroup>
  <LocalRegistry>podman</LocalRegistry>
</PropertyGroup>

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 user/repository).
  • 8.0-alpine etiket ve ailedir (aile, işletim sistemi paketlemesini belirsizleştirmeye 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

Varsayılan kapsayıcı etiketleri

Etiketler genellikle kapsayıcı görüntülerinde tutarlı meta veriler sağlamak için kullanılır. Yerleşik kapsayıcı araçları, oluşturulan görüntülerin kalitesini artırmak için bazı varsayılan etiketler sağlar. Tüm varsayılan etiket oluşturma, olarak ayarlanarak ContainerGenerateLabelsfalsedevre dışı bırakılabilir. Ayrıca, her varsayılan etiketin belirli bir etiketi devre dışı bırakmak için false ayarlanabilen tek bir etkinleştirme bayrağı vardır.

Mümkün olduğunda, mevcut MSBuild özellikleri bu etiketlerin değerlerini sağlar. Diğer özellikler, değerlerinin açıkça denetlenebilmesini sağlar.

Açıklama Varsayılan değer Ayrılmış özellik adı Geri dönüş özellik adı Etkin özellik adı Notlar
org.opencontainers.image.created ve org.opencontainers.artifact.created Geçerli UTC DateTime'ın RFC 3339 biçimi ContainerGenerateLabelsImageCreated
org.opencontainers.artifact.description ve org.opencontainers.image.description ContainerDescription Description ContainerGenerateLabelsImageDescription
org.opencontainers.image.authors ContainerAuthors Authors ContainerGenerateLabelsImageAuthors
org.opencontainers.image.url ContainerInformationUrl PackageProjectUrl ContainerGenerateLabelsImageUrl
org.opencontainers.image.documentation ContainerDocumentationUrl PackageProjectUrl ContainerGenerateLabelsImageDocumentation
org.opencontainers.image.version ContainerVersion PackageVersion ContainerGenerateLabelsImageVersion
org.opencontainers.image.vendor ContainerVendor ContainerGenerateLabelsImageVendor
org.opencontainers.image.licenses ContainerLicenseExpression PackageLicenseExpression ContainerGenerateLabelsImageLicenses
org.opencontainers.image.title ContainerTitle Title ContainerGenerateLabelsImageTitle
org.opencontainers.image.base.name ContainerBaseImage ContainerGenerateLabelsImageBaseName
org.opencontainers.image.base.digest ContainerGenerateLabelsImageBaseDigest Bu, seçilen temel görüntünün SHA özetidir. .NET SDK 9.0.100 ve üzeri sürümlerde kullanılabilir.
org.opencontainers.image.source PrivateRepositoryUrl ContainerGenerateLabelsImageSource Yalnızca ise PublishRepositoryUrltrueyazılır. Ayrıca Sourcelink altyapısının derlemenin bir parçası olmasına da dayanır.
org.opencontainers.image.revision SourceRevisionId ContainerGenerateLabelsImageRevision Yalnızca ise PublishRepositoryUrltrueyazılır. Ayrıca Sourcelink altyapısının derlemenin bir parçası olmasına da dayanır.

Ayrıca bkz.

  • dotnet publish ile bir .NET uygulamasını kapsayıcılı hale
  • .NET kapsayıcı görüntülerini