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:
- .NET 8+ SDK
.NET yüklüyse, hangi SDK'yı kullandığınızıdotnet --info
belirlemek için komutunu kullanın. - Docker Community Edition
- .NET 7+ SDK
.NET yüklüyse, hangi SDK'yı kullandığınızıdotnet --info
belirlemek için komutunu kullanın. - Docker Community Edition
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=DefaultContainer
değ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ü ContainerImageTags
iç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 edecektiruser/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 alpine
olarak 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-x64
linux-arm
linux-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 -r
dotnet 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:
- Azure Container Registry
- Amazon Elastic Container Registry
- Google Artifact Registry
- Docker Hub
- GitHub Paketleri
- 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ü notlara bakın.
ContainerRepository
Kapsayıcı deposu, görüntünün adıdır, örneğin veya dotnet/runtime
my-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-app
gö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 ContainerRepository
kullanı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 TargetFrameworks
ayarı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 olaraktcp
, geçerli değerler veyatcp
udp
ş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, , , ContainerDefaultArgs
ve ContainerAppCommandInstruction
birleşimlerini kullanarak uygulamanızın ContainerAppCommand
ContainerAppCommandArgs
nası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ın
ContainerAppCommandArgs
- 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ın
ContainerDefaultArgs
ContainerAppCommandInstruction
seçeneğiniDefaultArgs
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 ContainerAppCommand
uygulanması 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
, , ContainerAppCommandArgs
ve 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ı ,
ContainerAppCommandArgs
veContainerDefaultArgs
tarafındanContainerAppCommand
tanımlanır.
- Bu modda, giriş noktası ,
None
:- Bu modda, giriş noktası ,
ContainerEntrypointArgs
veContainerDefaultArgs
tarafındanContainerEntrypoint
tanımlanır.
- Bu modda, giriş noktası ,
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
deContainerEntrypoint
varsa,ContainerEntrypoint
giriş noktası olur veContainerAppCommand
komut olur.
- Bu en karmaşık moddur; öğelerden
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:groupname
ve 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
- Linux'ta köksüz kullanıcı
- 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 ContainerEntrypointArgs
kullanarak 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 ContainerEntrypoint
ayarlanı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
: KomuttaContainerEntrypoint
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 ContainerEntrypoint
sağ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 uygulanacakContainerEntrypoint
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'ninDateTime
ISO 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