Kontejnerizace aplikace .NET s publikováním dotnet
Kontejnery mají mnoho funkcí a výhod, jako je neměnná infrastruktura, poskytuje přenosnou architekturu a umožňuje škálovatelnost. Image se dá použít k vytvoření kontejnerů pro místní vývojové prostředí, privátní cloud nebo veřejný cloud. V tomto kurzu se naučíte kontejnerizovat aplikaci .NET pomocí příkazu dotnet publish .
Požadavky
Nainstalujte následující požadavky:
- Sada .NET 8+ SDK
Pokud máte nainstalovanoudotnet --info
technologii .NET, pomocí příkazu určete, kterou sadu SDK používáte. - Docker Community Edition
- Sada .NET 7+ SDK
Pokud máte nainstalovanoudotnet --info
technologii .NET, pomocí příkazu určete, kterou sadu SDK používáte. - Docker Community Edition
Kromě těchto požadavků se doporučuje, abyste se seznámili s pracovními službami v .NET.
Vytvoření aplikace .NET
K kontejnerizaci potřebujete aplikaci .NET, takže začněte vytvořením nové aplikace ze šablony. Otevřete terminál, vytvořte pracovní složku (sample-directory), pokud jste to ještě neudělali, a změňte adresáře tak, abyste v něm byli. V pracovní složce spusťte následující příkaz, který vytvoří nový projekt v podadresáři s názvem Worker:
dotnet new worker -o Worker -n DotNet.ContainerImage
Strom složek vypadá takto:
📁 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
Příkaz dotnet new
vytvoří novou složku s názvem Worker a vygeneruje službu pracovního procesu, která při spuštění zaprokoluje zprávu. V relaci terminálu změňte adresáře a přejděte do složky Worker . dotnet run
Spusťte aplikaci pomocí příkazu.
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...
Šablona pracovního procesu se trvale smyčuje. K zastavení použijte příkaz zrušit Ctrl+C .
Přidání balíčku NuGet
Balíček NuGet Microsoft.NET.Build.Containers se v současné době vyžaduje k publikování jiných než webových projektů jako kontejneru. Pokud chcete přidat Microsoft.NET.Build.Containers
balíček NuGet do šablony pracovního procesu, spusťte následující příkaz dotnet add package :
dotnet add package Microsoft.NET.Build.Containers
Tip
Pokud vytváříte webovou aplikaci a používáte sadu .NET SDK 7.0.300 nebo novější, balíček se nevyžaduje – sada SDK obsahuje stejné funkce.
Nastavení názvu image kontejneru
Při publikování aplikace jako kontejneru jsou k dispozici různé možnosti konfigurace.
Ve výchozím nastavení je AssemblyName
název image kontejneru projektem. Pokud je tento název neplatný jako název image kontejneru, můžete ho přepsat zadáním obrázku ContainerRepository
, jak je znázorněno v následujícím souboru projektu:
<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>
Další informace najdete v tématu ContainerRepository.
Ve výchozím nastavení je AssemblyName
název image kontejneru projektem. Pokud je tento název neplatný jako název image kontejneru, můžete ho přepsat zadáním (ContainerImageName
zastaralého) nebo upřednostňovaného ContainerRepository
názvu, jak je znázorněno v následujícím souboru projektu:
<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>
Další informace naleznete v tématu ContainerImageName.
Publikování aplikace .NET
Pokud chcete aplikaci .NET publikovat jako kontejner, použijte následující příkaz dotnet publish :
dotnet publish --os linux --arch x64 /t:PublishContainer -c Release
Předchozí příkaz .NET CLI publikuje aplikaci jako kontejner:
- Cílení na Linux jako operační systém (
--os linux
). - Určení architektury x64 (
--arch x64
). - Použití konfigurace vydané verze (
-c Release
).
Důležité
Pokud chcete sestavit kontejner místně, musíte mít spuštěný proces démon Dockeru. Pokud se při pokusu o publikování aplikace jako kontejneru nespustí, zobrazí se chyba podobná této:
..\build\Microsoft.NET.Build.Containers.targets(66,9): error MSB4018:
The "CreateNewImage" task failed unexpectedly. [..\Worker\DotNet.ContainerImage.csproj]
Tip
V závislosti na typu aplikace, kterou kontejnerizujete, se můžou přepínače příkazového řádku (možnosti) lišit. Argument se například /t:PublishContainer
vyžaduje jenom pro jiné než webové aplikace .NET, jako console
jsou například šablony worker
. U webových šablon nahraďte /t:PublishContainer
argument .-p:PublishProfile=DefaultContainer
Další informace najdete v tématu Sestavení kontejnerů .NET SDK, problém č. 141.
Příkaz vytvoří výstup podobný ukázkovém výstupu:
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
Tento příkaz zkompiluje vaši pracovní aplikaci do složky publish a odešle kontejner do místního registru Dockeru.
Konfigurace image kontejneru
Pomocí vlastností NÁSTROJE MSBuild můžete řídit mnoho aspektů vygenerovaného kontejneru. Obecně platí, že pokud můžete pomocí příkazu v souboru Dockerfile nastavit určitou konfiguraci, můžete to udělat prostřednictvím nástroje MSBuild.
Poznámka:
Jedinou výjimkou jsou RUN
příkazy. Vzhledem ke způsobu, jakým se kontejnery vytvářejí, není možné je emulovat. Pokud tuto funkci potřebujete, budete muset k sestavení imagí kontejneru použít soubor Dockerfile .
ContainerArchiveOutputPath
Počínaje rozhraním .NET 8 můžete vytvořit kontejner přímo jako archiv tar.gz . Tato funkce je užitečná, pokud pracovní postup není jednoduchý a vyžaduje, abyste například před nasdílením obrázků spustili nástroj pro skenování. Po vytvoření archivu ho můžete přesunout, zkontrolovat nebo načíst do místní sady nástrojů Dockeru.
Pokud chcete publikovat do archivu ContainerArchiveOutputPath
, přidejte do příkazu vlastnost dotnet publish
, například:
dotnet publish \
-p PublishProfile=DefaultContainer \
-p ContainerArchiveOutputPath=./images/sdk-container-demo.tar.gz
Můžete zadat název složky nebo cestu s určitým názvem souboru. Pokud zadáte název složky, název souboru vygenerovaný pro soubor archivu obrázku bude $(ContainerRepository).tar.gz
. Tyto archivy mohou obsahovat více značek uvnitř, pouze když je vytvořen jeden soubor pro všechny ContainerImageTags
.
Konfigurace pojmenování imagí kontejneru
Image kontejnerů se řídí konkrétní konvencí vytváření názvů. Název image se skládá z několika částí, registru, volitelného portu, úložiště a volitelné značky a rodiny.
REGISTRY[:PORT]/REPOSITORY[:TAG[-FAMILY]]
Představte si například plně kvalifikovaný mcr.microsoft.com/dotnet/runtime:8.0-alpine
název image:
mcr.microsoft.com
je registr (a v tomto případě představuje registr kontejneru Microsoftu).dotnet/runtime
je úložiště (ale někteří touser/repository
považují za toto).8.0-alpine
je značka a rodina (rodina je volitelný specifikátor, který pomáhá nejednoznačný obal operačního systému).
Některé vlastnosti popsané v následujících částech odpovídají správě částí vygenerovaného názvu image. Představte si následující tabulku, která mapuje vztah mezi názvem image a vlastnostmi sestavení:
Část název obrázku | Vlastnost MSBuild | Ukázkové hodnoty |
---|---|---|
REGISTRY[:PORT] |
ContainerRegistry |
mcr.microsoft.com:443 |
PORT |
ContainerPort |
:443 |
REPOSITORY |
ContainerRepository |
dotnet/runtime |
TAG |
ContainerImageTag |
8.0 |
FAMILY |
ContainerFamily |
-alpine |
Část název obrázku | Vlastnost MSBuild | Ukázkové hodnoty |
---|---|---|
REGISTRY[:PORT] |
ContainerRegistry |
mcr.microsoft.com:443 |
PORT |
ContainerPort |
:443 |
REPOSITORY |
ContainerImageName |
dotnet/runtime |
TAG |
ContainerImageTag |
8.0 |
Následující části popisují různé vlastnosti, které lze použít k řízení vygenerované image kontejneru.
ContainerBaseImage
Vlastnost základní image kontejneru řídí image použitou jako základ pro vaši image. Ve výchozím nastavení se na základě vlastností projektu odvozují následující hodnoty:
- Pokud je projekt samostatně obsažený,
mcr.microsoft.com/dotnet/runtime-deps
image se použije jako základní image. - Pokud je váš projekt ASP.NET Core,
mcr.microsoft.com/dotnet/aspnet
image se použije jako základní image. mcr.microsoft.com/dotnet/runtime
Jinak se image použije jako základní image.
Značka obrázku je odvozena jako číselná komponenta zvoleného TargetFramework
obrázku . Například projekt, který cílí net6.0
na výsledky 6.0
značky odvozené základní image, a net7.0-linux
projekt používá 7.0
značku atd.
Pokud tady nastavíte hodnotu, měli byste nastavit plně kvalifikovaný název image, který se má použít jako základ, včetně libovolné značky, kterou dáváte přednost:
<PropertyGroup>
<ContainerBaseImage>mcr.microsoft.com/dotnet/runtime:8.0</ContainerBaseImage>
</PropertyGroup>
<PropertyGroup>
<ContainerBaseImage>mcr.microsoft.com/dotnet/runtime:7.0</ContainerBaseImage>
</PropertyGroup>
ContainerFamily
Počínaje rozhraním .NET 8 můžete pomocí ContainerFamily
vlastnosti MSBuild zvolit jinou řadu imagí kontejnerů poskytovaných Microsoftem jako základní image pro vaši aplikaci. Při nastavení se tato hodnota připojí na konec vybrané značky specifické pro TFM a změní zadanou značku. Pokud chcete například použít varianty Alpine Linux základních imagí .NET, můžete nastavit ContainerFamily
následující alpine
:
<PropertyGroup>
<ContainerFamily>alpine</ContainerFamily>
</PropertyGroup>
Předchozí konfigurace projektu má za následek konečnou značku 8.0-alpine
pro aplikaci zacílenou na .NET 8.
Toto pole je volné a často se dá použít k výběru různých distribucí operačního systému, výchozích konfigurací balíčků nebo jiných změn základní image. Toto pole se při nastavení ignoruje ContainerBaseImage
. Další informace najdete v tématu Image kontejneru .NET.
ContainerRuntimeIdentifier
Vlastnost identifikátoru modulu runtime kontejneru řídí operační systém a architekturu používanou kontejnerem, pokud containerBaseImage podporuje více než jednu platformu. Image například mcr.microsoft.com/dotnet/runtime
aktuálně podporuje linux-x64
a linux-arm
linux-arm64
win10-x64
obrázky za stejnou značkou, takže nástroje potřebují způsob, jak zjistit, které z těchto verzí chcete použít. Ve výchozím nastavení je tato hodnota nastavená na hodnotu RuntimeIdentifier
, kterou jste zvolili při publikování kontejneru. Tuto vlastnost je potřeba explicitně nastavit jen zřídka – místo toho použijte -r
možnost příkazu dotnet publish
. Pokud vybraná image nepodporuje RuntimeIdentifier
vámi zvolenou image, dojde k chybě popisovače RuntimeIdentifiers, které image podporuje.
Vlastnost můžete vždy nastavit ContainerBaseImage
na plně kvalifikovaný název image, včetně značky, abyste nemuseli tuto vlastnost vůbec používat.
<PropertyGroup>
<ContainerRuntimeIdentifier>linux-arm64</ContainerRuntimeIdentifier>
</PropertyGroup>
Další informace o identifikátorech modulu runtime podporovaných rozhraním .NET najdete v katalogu IDENTIFIKÁTORŮ RID.
ContainerRegistry
Vlastnost registru kontejneru řídí cílový registr, místo, do kterého se nově vytvořená image odešle. Ve výchozím nastavení se nasdílí do místního démona Dockeru, ale můžete také zadat vzdálený registr. Při použití vzdáleného registru, který vyžaduje ověřování, se ověřuje pomocí známých docker login
mechanismů. Další informace najdete v tématu ověřování v registrech kontejnerů, kde najdete další podrobnosti. Pro konkrétní příklad použití této vlastnosti zvažte následující příklad XML:
<PropertyGroup>
<ContainerRegistry>registry.mycorp.com:1234</ContainerRegistry>
</PropertyGroup>
Tento nástroj podporuje publikování do libovolného registru, který podporuje rozhraní HTTP API registru Dockeru V2. To zahrnuje následující registry explicitně (a pravděpodobně mnohem implicitněji):
- Azure Container Registry
- Amazon Elastic Container Registry
- Google Artifact Registry
- Centrum Dockeru
- GitHub Packages
- Container Registry hostovaný v GitLabu
- Quay.io
Poznámky k práci s těmito registry najdete v poznámkách specifických pro registr.
ContainerRepository
Úložiště kontejneru je název samotné image, dotnet/runtime
například nebo my-app
. Ve výchozím nastavení AssemblyName
se používá projekt.
<PropertyGroup>
<ContainerRepository>my-app</ContainerRepository>
</PropertyGroup>
ContainerImageName
Název image kontejneru řídí název samotné image, dotnet/runtime
například nebo my-app
. Ve výchozím nastavení AssemblyName
se používá projekt.
<PropertyGroup>
<ContainerImageName>my-app</ContainerImageName>
</PropertyGroup>
Poznámka:
Počínaje rozhraním .NET 8 ContainerImageName
je ve prospěch ContainerRepository
.
Názvy obrázků se skládají z jednoho nebo více segmentů oddělených lomítkem, z nichž každý může obsahovat jenom malá písmena alfanumerických znaků, tečky, podtržítka a pomlčky a musí začínat písmenem nebo číslicí. Všechny ostatní znaky způsobí vyvolání chyby.
ContainerImageTag(s)
Vlastnost značky image kontejneru řídí značky, které jsou pro image generovány. Chcete-li zadat použití jedné značky ContainerImageTag
a pro více značek použít ContainerImageTags
.
Důležité
Když použijete ContainerImageTags
, skončíte s více obrázky, jednou za jedinečnou značku.
Značky se často používají k odkazování na různé verze aplikace, ale mohou také odkazovat na různé distribuce operačního systému nebo dokonce různé konfigurace.
Počínaje rozhraním .NET 8 platí, že pokud není zadána výchozí latest
značka.
Ve výchozím nastavení Version
se projekt používá jako hodnota značky.
Chcete-li přepsat výchozí nastavení, zadejte jednu z následujících možností:
<PropertyGroup>
<ContainerImageTag>1.2.3-alpha2</ContainerImageTag>
</PropertyGroup>
Chcete-li zadat více značek, použijte v vlastnosti středník oddělenou sadu značek ContainerImageTags
, podobně jako nastavení více TargetFrameworks
:
<PropertyGroup>
<ContainerImageTags>1.2.3-alpha2;latest</ContainerImageTags>
</PropertyGroup>
Značky můžou obsahovat maximálně 127 alfanumerických znaků, tečk, podtržítka a pomlčky. Musí začínat alfanumerickým znakem nebo podtržítkem. Výsledkem jakéhokoli jiného formuláře je vyvolána chyba.
Poznámka:
Při použití ContainerImageTags
jsou značky oddělené znakem ;
. Pokud voláte dotnet publish
z příkazového řádku (stejně jako u většiny prostředí CI/CD), budete muset hodnoty zabalit do jednoho '
a vnitřního obtékání dvojitými uvozovkami "
, například (='"tag-1;tag-2"'
). Zvažte následující dotnet publish
příkaz:
dotnet publish -p ContainerImageTags='"1.2.3-alpha2;latest"'
Výsledkem je vygenerování dvou obrázků: my-app:1.2.3-alpha2
a my-app:latest
.
Tip
Pokud dochází k problémům s ContainerImageTags
vlastností, zvažte místo toho nastavení rozsahu proměnné ContainerImageTags
prostředí:
ContainerImageTags='1.2.3;latest' dotnet publish
ContainerLabel
Popisek kontejneru přidá do kontejneru popisek metadat. Popisky nemají žádný vliv na kontejner za běhu, ale často se používají k ukládání metadat verzí a vytváření pro použití skenery zabezpečení a dalšími nástroji infrastruktury. Můžete zadat libovolný počet popisků kontejnerů.
Uzel ContainerLabel
má dva atributy:
Include
: Klíč popisku.Value
: Hodnota popisku (může být prázdná).
<ItemGroup>
<ContainerLabel Include="org.contoso.businessunit" Value="contoso-university" />
</ItemGroup>
Seznam popisků vytvořených ve výchozím nastavení najdete v tématu Výchozí popisky kontejneru.
Konfigurace spouštění kontejnerů
K řízení provádění kontejneru můžete použít následující vlastnosti NÁSTROJE MSBuild.
ContainerWorkingDirectory
Uzel pracovního adresáře kontejneru řídí pracovní adresář kontejneru, adresář, v rámci kterého se spouští příkazy, pokud není spuštěn jiný příkaz.
Ve výchozím nastavení /app
se hodnota adresáře používá jako pracovní adresář.
<PropertyGroup>
<ContainerWorkingDirectory>/bin</ContainerWorkingDirectory>
</PropertyGroup>
ContainerPort
Port kontejneru přidá porty TCP nebo UDP do seznamu známých portů pro kontejner. To umožňuje, aby moduly runtime kontejnerů, jako je Docker, automaticky mapují tyto porty na hostitelský počítač. Často se používá jako dokumentace pro kontejner, ale dá se použít také k povolení automatického mapování portů.
Uzel ContainerPort
má dva atributy:
Include
: Číslo portu, které se má zveřejnit.Type
: Výchozí hodnotatcp
, platné hodnoty jsou buďtcp
neboudp
.
<ItemGroup>
<ContainerPort Include="80" Type="tcp" />
</ItemGroup>
Počínaje rozhraním .NET 8 se odvozuje, ContainerPort
pokud není explicitně zadáno na základě několika dobře známých proměnných prostředí ASP.NET:
ASPNETCORE_URLS
ASPNETCORE_HTTP_PORTS
ASPNETCORE_HTTPS_PORTS
Pokud jsou tyto proměnné prostředí přítomny, jejich hodnoty se analyzují a převedou na mapování portů TCP. Tyto proměnné prostředí se čtou ze základní image, pokud jsou k dispozici, nebo z proměnných prostředí definovaných v projektu prostřednictvím ContainerEnvironmentVariable
položek. Další informace naleznete v tématu ContainerEnvironmentVariable.
ContainerEnvironmentVariable
Uzel proměnné prostředí kontejneru umožňuje přidat do kontejneru proměnné prostředí. Proměnné prostředí jsou přístupné pro aplikaci spuštěnou v kontejneru okamžitě a často se používají ke změně chování spuštěné aplikace za běhu.
Uzel ContainerEnvironmentVariable
má dva atributy:
Include
: Název proměnné prostředí.Value
: Hodnota proměnné prostředí.
<ItemGroup>
<ContainerEnvironmentVariable Include="LOGGER_VERBOSITY" Value="Trace" />
</ItemGroup>
Další informace najdete v tématu Proměnné prostředí .NET.
Konfigurace příkazů kontejneru
Ve výchozím nastavení nástroje kontejneru spustí vaši aplikaci buď pomocí vygenerovaného binárního souboru AppHost pro vaši aplikaci (pokud vaše aplikace používá AppHost), nebo dotnet
pomocí příkazu a knihovny DLL vaší aplikace.
Způsob spouštění aplikace však můžete řídit pomocí některé kombinace ContainerAppCommand
ContainerAppCommandArgs
, , ContainerDefaultArgs
a ContainerAppCommandInstruction
.
Tyto různé body konfigurace existují, protože různé základní image používají různé kombinace kontejneru ENTRYPOINT
a COMMAND
vlastností a chcete mít možnost podporovat všechny z nich. Výchozí hodnoty by měly být použitelné pro většinu aplikací, ale pokud chcete přizpůsobit chování při spuštění aplikace, měli byste:
- Identifikujte binární soubor, který se má spustit, a nastavte ho jako
ContainerAppCommand
- Určete, které argumenty jsou potřeba ke spuštění aplikace, a nastavte je jako
ContainerAppCommandArgs
- Určete, které argumenty (pokud nějaké) jsou volitelné , a uživatel je může přepsat a nastavit je jako
ContainerDefaultArgs
- Nastavte
ContainerAppCommandInstruction
na hodnotuDefaultArgs
.
Další informace najdete v následujících položkách konfigurace.
ContainerAppCommand
Položka konfigurace příkazu aplikace je logický vstupní bod vaší aplikace. U většiny aplikací se jedná o AppHost, vygenerovaný spustitelný binární soubor pro vaši aplikaci. Pokud vaše aplikace negeneruje AppHost, bude tento příkaz obvykle dotnet <your project dll>
. Tyto hodnoty se použijí po libovolném ENTRYPOINT
základním kontejneru nebo přímo v případě, že nejsou ENTRYPOINT
definovány.
Konfigurace ContainerAppCommand
má jednu Include
vlastnost, která představuje příkaz, možnost nebo argument pro použití v příkazu vstupního bodu:
<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
Tato položka příkazu aplikace args konfigurace představuje všechny logicky požadované argumenty pro vaši aplikaci, které by se měly použít na ContainerAppCommand
. Ve výchozím nastavení se pro aplikaci negenerují žádné. Pokud jsou k dispozici, použijí sergy v kontejneru při jeho spuštění.
Konfigurace ContainerAppCommandArgs
má jednu Include
vlastnost, která představuje možnost nebo argument, který se má použít pro ContainerAppCommand
příkaz.
<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
Tato výchozí položka konfigurace args představuje všechny argumenty přepisovatelné uživatelem pro vaši aplikaci. To je dobrý způsob, jak poskytnout výchozí hodnoty, které může vaše aplikace potřebovat spustit způsobem, který usnadňuje spuštění, ale i tak snadné přizpůsobení.
Konfigurace ContainerDefaultArgs
má jednu Include
vlastnost, která představuje možnost nebo argument, který se má použít pro ContainerAppCommand
příkaz.
<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
Konfigurace instrukce příkazu aplikace pomáhá řídit způsob, jakým ContainerEntrypoint
, ContainerEntrypointArgs
, ContainerAppCommand
, ContainerAppCommandArgs
a ContainerDefaultArgs
jsou kombinovány tak, aby se vytvořil konečný příkaz, který se spustí v kontejneru. To velmi závisí na tom, jestli ENTRYPOINT
je v základní imagi k dispozici. Tato vlastnost má jednu ze tří hodnot: "DefaultArgs"
, "Entrypoint"
nebo "None"
.
Entrypoint
:- V tomto režimu je vstupní bod definován pomocí
ContainerAppCommand
,ContainerAppCommandArgs
aContainerDefaultArgs
.
- V tomto režimu je vstupní bod definován pomocí
None
:- V tomto režimu je vstupní bod definován pomocí
ContainerEntrypoint
,ContainerEntrypointArgs
aContainerDefaultArgs
.
- V tomto režimu je vstupní bod definován pomocí
DefaultArgs
:- Jedná se o nejsložitější režim – pokud nejsou k dispozici žádné položky
ContainerEntrypoint[Args]
,ContainerAppCommand[Args]
ContainerDefaultArgs
slouží k vytvoření vstupního bodu a příkazu. Vstupní bod základní image pro základní image, které mají pevně zakódovanédotnet
nebo/usr/bin/dotnet
se přeskočí, takže máte úplnou kontrolu. - Pokud jsou oba
ContainerEntrypoint
aContainerAppCommand
jsou k dispozici,ContainerEntrypoint
stane se vstupním bodem aContainerAppCommand
stane se příkazem.
- Jedná se o nejsložitější režim – pokud nejsou k dispozici žádné položky
Poznámka:
Položky ContainerEntrypoint
konfigurace byly ContainerEntrypointArgs
vyřazeny z .NET 8.
Důležité
To je pro pokročilé uživatele, které většina aplikací nemusí přizpůsobovat jejich vstupní bod do tohoto stupně. Další informace a pokud chcete poskytnout případy použití pro vaše scénáře, najdete v tématu GitHub: Diskuze o sestavení kontejneru .NET SDK.
ContainerUser
Vlastnost konfigurace uživatele řídí výchozího uživatele, který kontejner spouští jako. To se často používá ke spuštění kontejneru jako uživatele, který není v kořenovém adresáři, což je osvědčený postup zabezpečení. Pro tuto konfiguraci existuje několik omezení, o které je potřeba vědět:
- Může to mít různé formy – uživatelské jméno, ID uživatele linuxu, název skupiny, ID
username:groupname
skupiny linuxu a další varianty ID. - Neexistuje žádné ověření, že zadaný uživatel nebo skupina na obrázku existuje.
- Změna uživatele může změnit chování aplikace, zejména pokud jde o věci, jako jsou oprávnění systému souborů.
Výchozí hodnota tohoto pole se liší podle projektu TFM a cílového operačního systému:
- Pokud cílíte na .NET 8 nebo novější a používáte image modulu runtime Microsoftu, postupujte takhle:
- v Linuxu se používá uživatel
app
bez rootu (i když na něj odkazuje jeho ID uživatele). - v systému Windows se používá uživatel
ContainerUser
bez rootu.
- v Linuxu se používá uživatel
- V opačném případě se nepoužívá žádné výchozí nastavení
ContainerUser
.
<PropertyGroup>
<ContainerUser>my-existing-app-user</ContainerUser>
</PropertyGroup>
Tip
Proměnná APP_UID
prostředí slouží k nastavení informací o uživatelích v kontejneru. Tato hodnota může pocházet z proměnných prostředí definovaných v základní imagi (například z imagí Microsoft .NET), nebo ji můžete nastavit sami pomocí ContainerEnvironmentVariable
syntaxe.
Můžete ale řídit, jak se aplikace spouští pomocí ContainerEntrypoint
a ContainerEntrypointArgs
.
ContainerEntrypoint
Vstupní bod kontejneru lze použít k přizpůsobení ENTRYPOINT
kontejneru, což je spustitelný soubor, který se volá při spuštění kontejneru. Ve výchozím nastavení se pro sestavení, která vytvářejí hostitele aplikace, nastaví jako ContainerEntrypoint
. Pro sestavení, které nevytvoří spustitelný soubor, dotnet path/to/app.dll
se použije jako ContainerEntrypoint
.
Uzel ContainerEntrypoint
má jeden atribut:
Include
: Příkaz, možnost nebo argument, který se má použít vContainerEntrypoint
příkazu.
Představte si například následující ukázkovou skupinu položek projektu .NET:
<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
Uzel args vstupního bodu kontejneru řídí výchozí argumenty zadané do objektu ContainerEntrypoint
. To by se mělo použít, pokud ContainerEntrypoint
je program, který uživatel může chtít použít samostatně. Ve výchozím nastavení se za vás nevytvořila žádná ContainerEntrypointArgs
.
Uzel ContainerEntrypointArg
má jeden atribut:
Include
: Možnost nebo argument, které se mají použít proContainerEntrypoint
příkaz.
Představte si následující příklad skupiny položek projektu .NET:
<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>
Výchozí popisky kontejnerů
Popisky se často používají k poskytování konzistentních metadat u imagí kontejnerů. Tento balíček obsahuje některé výchozí popisky, které podporují lepší udržovatelnost vygenerovaných imagí.
org.opencontainers.image.created
je nastaven na formát ISO 8601 aktuálního UTCDateTime
.
Další informace najdete v tématu Implementace konvenčních popisků nad existující infrastrukturou popisků.
Vyčištění prostředků
V tomto článku jste publikovali pracovní proces .NET jako image kontejneru. Pokud chcete, odstraňte tento prostředek. docker images
Pomocí příkazu zobrazíte seznam nainstalovaných imagí.
docker images
Představte si následující příklad výstupu:
REPOSITORY TAG IMAGE ID CREATED SIZE
dotnet-worker-image 1.0.0 25aeb97a2e21 12 seconds ago 191MB
Tip
Soubory obrázků můžou být velké. Obvykle byste při testování a vývoji aplikace odebrali dočasné kontejnery, které jste vytvořili. Pokud plánujete vytvářet další image založené na daném modulu runtime, obvykle zachováte základní image s nainstalovaným modulem runtime.
Pokud chcete image odstranit, zkopírujte ID image a spusťte docker image rm
příkaz:
docker image rm 25aeb97a2e21