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:

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ří to user/repositorypovaž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 TargetFrameworkobrá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-x64a linux-armlinux-arm64win10-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):

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í latestznač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í ContainerImageTagsjsou 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í hodnota tcp, platné hodnoty jsou buď tcp nebo udp.
<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 ContainerAppCommandContainerAppCommandArgs, , ContainerDefaultArgsa 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 hodnotu DefaultArgs.

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, ContainerAppCommandArgsa 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, ContainerAppCommandArgsa ContainerDefaultArgs.
  • None:
    • V tomto režimu je vstupní bod definován pomocí ContainerEntrypoint, ContainerEntrypointArgsa ContainerDefaultArgs.
  • 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 a ContainerAppCommand jsou k dispozici, ContainerEntrypoint stane se vstupním bodem a ContainerAppCommand stane se příkazem.

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:groupnameskupiny 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 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 v ContainerEntrypoint 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 pro ContainerEntrypoint 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 UTC DateTime.

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

Další kroky