.NET-alkalmazás tárolóba helyezése dotnet-közzététellel

A tárolók számos funkcióval és előnnyel rendelkeznek, például nem módosítható infrastruktúra, hordozható architektúrát biztosítanak, és lehetővé teszik a méretezhetőséget. A rendszerkép segítségével tárolókat hozhat létre a helyi fejlesztési környezethez, a magánfelhőhöz vagy a nyilvános felhőhöz. Ebben az oktatóanyagban megtudhatja, hogyan tárolózhat egy .NET-alkalmazást a dotnet publish paranccsal.

Előfeltételek

Telepítse a következő előfeltételeket:

Ezen előfeltételek mellett javasoljuk, hogy a .NET-ben is ismeri a Worker Services szolgáltatást.

.NET-alkalmazás létrehozása

A tárolók tárolásához .NET-alkalmazásra van szükség, ezért először hozzon létre egy új alkalmazást egy sablonból. Nyissa meg a terminált, hozzon létre egy munkamappát (mintakönyvtárat), ha még nem tette meg, és módosítsa a könyvtárakat, hogy benne legyen. A munkamappában futtassa a következő parancsot egy új projekt létrehozásához egy Feldolgozó nevű alkönyvtárban:

dotnet new worker -o Worker -n DotNet.ContainerImage

A mappafa a következőhöz hasonlóan néz ki:

📁 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

A dotnet new parancs létrehoz egy Feldolgozó nevű új mappát, és létrehoz egy feldolgozó szolgáltatást, amely futtatáskor másodpercenként naplóz egy üzenetet. A terminálmunkamenetben módosítsa a címtárakat, és lépjen a Feldolgozó mappába. dotnet run Az alkalmazás elindításához használja a parancsot.

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...

A feldolgozósablon korlátlanul hurkol. A Ctrl+C billentyűkombinációval állítsa le.

NuGet-csomag hozzáadása

A Microsoft.NET.Build.Containers NuGet-csomag jelenleg nem webes projektek tárolóként való közzétételéhez szükséges. Ha hozzá szeretné adni a Microsoft.NET.Build.Containers NuGet-csomagot a feldolgozósablonhoz, futtassa a következő dotnet add package parancsot:

dotnet add package Microsoft.NET.Build.Containers

Tipp.

Ha webalkalmazást készít, és a .NET SDK 7.0.300 vagy újabb verzióját használja, akkor a csomag nem szükséges – az SDK a dobozon kívül ugyanazokat a funkciókat tartalmazza.

A tárolórendszerkép nevének beállítása

Az alkalmazások tárolóként való közzétételekor különböző konfigurációs lehetőségek állnak rendelkezésre.

Alapértelmezés szerint a tárolórendszerkép neve a AssemblyName projekt neve. Ha ez a név tárolórendszerkép-névként érvénytelen, felülbírálhatja a következő projektfájlban látható módon ContainerRepository :

<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>

További információ: ContainerRepository.

Alapértelmezés szerint a tárolórendszerkép neve a AssemblyName projekt neve. Ha ez a név tárolórendszerkép-névként érvénytelen, felülbírálhatja egy (ContainerImageName elavult) vagy az előnyben részesített ContainerRepository nevet az alábbi projektfájlban látható módon:

<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>

További információ: ContainerImageName.

.NET-alkalmazás közzététele

A .NET-alkalmazás tárolóként való közzétételéhez használja a következő dotnet publish parancsot:

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

Az előző .NET CLI-parancs tárolóként teszi közzé az alkalmazást:

  • Linux operációs rendszerként való célzás (--os linux).
  • X64-architektúra megadása (--arch x64).
  • A kiadási konfiguráció (-c Release) használata.

Fontos

A tároló helyi létrehozásához futtassa a Docker-démont. Ha nem fut, amikor tárolóként próbálja közzétenni az alkalmazást, az alábbihoz hasonló hibaüzenet jelenik meg:

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

Tipp.

A tárolóba helyezett alkalmazás típusától függően a parancssori kapcsolók (beállítások) eltérhetnek. Az argumentumra például csak a /t:PublishContainer nem webes .NET-alkalmazások, például a consoleworker sablonok esetében van szükség. Websablonok esetén cserélje le az argumentumot a /t:PublishContainer következőre -p:PublishProfile=DefaultContainer: . További információ: .NET SDK-tárolók buildjei, 141. probléma.

A parancs a példakimenethez hasonló kimenetet hoz létre:

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

Ez a parancs lefordítja a feldolgozó alkalmazást a közzétételi mappába, és leküldi a tárolót a helyi Docker-beállításjegyzékbe.

Tárolórendszerkép konfigurálása

A létrehozott tároló számos aspektusát vezérelheti az MSBuild tulajdonságokon keresztül. Általánosságban elmondható, hogy ha egy Dockerfile parancsával beállíthat néhány konfigurációt, ugyanezt megteheti az MSBuild használatával is.

Feljegyzés

Ez alól csak a parancsok kivételek RUN . A tárolók felépítése miatt ezek nem emulálhatók. Ha szüksége van erre a funkcióra, egy Dockerfile használatával kell létrehoznia a tárolólemezképeket.

ContainerArchiveOutputPath

A .NET 8-tól kezdve közvetlenül tar.gz archívumként hozhat létre tárolókat. Ez a funkció akkor hasznos, ha a munkafolyamat nem egyszerű, és például leküldés előtt le kell futtatnia egy ellenőrzőeszközt a képeken. Az archívum létrehozása után áthelyezheti, átvizsgálhatja vagy betöltheti egy helyi Docker-eszközláncba.

Az archívumban való közzétételhez adja hozzá a tulajdonságot a ContainerArchiveOutputPathdotnet publish parancshoz, például:

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

Megadhat egy mappanevet vagy egy adott fájlnévvel rendelkező elérési utat. Ha megadja a mappa nevét, a rendszer a képarchívumfájlhoz létrehozott fájlnevet fogja $(ContainerRepository).tar.gzmegadni. Ezek az archívumok több címkét is tartalmazhatnak bennük, csak egyetlen fájl létrehozásakor.ContainerImageTags

Tárolórendszerkép elnevezési konfigurációja

A tárolórendszerképek egy adott elnevezési konvenciót követnek. A rendszerkép neve több részből áll, a beállításjegyzékből, az opcionális portból, az adattárból, valamint az opcionális címkéből és családból.

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

Vegyük például a teljes képnevet mcr.microsoft.com/dotnet/runtime:8.0-alpine :

  • mcr.microsoft.com a beállításjegyzék (és ebben az esetben a Microsoft tárolóregisztrációs adatbázisát jelöli).
  • dotnet/runtime az adattár (de vannak, akik ezt a user/repository).
  • 8.0-alpine a címke és a család (a család egy opcionális kijelölő, amely segít az operációs rendszer csomagolásának egyértelműsítésében).

A következő szakaszokban ismertetett tulajdonságok némelyike megfelel a létrehozott képnév egyes részeinek kezelésének. Vegye figyelembe az alábbi táblázatot, amely a kép neve és a buildtulajdonságok közötti kapcsolatot képezi le:

Képnév rész MSBuild tulajdonság Példaértékek
REGISTRY[:PORT] ContainerRegistry mcr.microsoft.com:443
PORT ContainerPort :443
REPOSITORY ContainerRepository dotnet/runtime
TAG ContainerImageTag 8.0
FAMILY ContainerFamily -alpine
Képnév rész MSBuild tulajdonság Példaértékek
REGISTRY[:PORT] ContainerRegistry mcr.microsoft.com:443
PORT ContainerPort :443
REPOSITORY ContainerImageName dotnet/runtime
TAG ContainerImageTag 8.0

Az alábbi szakaszok ismertetik a létrehozott tárolólemezkép szabályozására használható különböző tulajdonságokat.

ContainerBaseImage

A tároló alaprendszerkép tulajdonsága szabályozza a rendszerkép alapjául használt rendszerképet. Alapértelmezés szerint a projekt tulajdonságai alapján a következő értékek lesznek kikövetkeztetve:

  • Ha a projekt önálló, a rendszer a mcr.microsoft.com/dotnet/runtime-deps rendszerképet használja alaprendszerképként.
  • Ha a projekt egy ASP.NET Core-projekt, akkor a mcr.microsoft.com/dotnet/aspnet rendszerképet használja alaprendszerképként.
  • Ellenkező esetben a rendszer a mcr.microsoft.com/dotnet/runtime rendszerképet használja alapképként.

A rendszer a kép címkéjét a kiválasztott TargetFrameworkelem numerikus összetevőjének jelöli. Egy projekt célzása net6.0 például a 6.0 kikövetkeztetett alaprendszerkép címkéjét eredményezi, egy net7.0-linux projekt pedig a 7.0 címkét használja stb.

Ha itt állít be egy értéket, állítsa be a kép teljes nevét alapként, beleértve a kívánt címkét is:

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

ContainerFamily

A .NET 8-tól kezdve az ContainerFamily MSBuild tulajdonsággal választhatja ki a Microsoft által biztosított tárolólemezképek egy másik családját az alkalmazás alaprendszerképeként. Ha be van állítva, a rendszer hozzáfűzi ezt az értéket a kijelölt TFM-specifikus címke végéhez, módosítva a megadott címkét. A .NET-alaprendszerképek Alpine Linux-változatainak használatához például a következőt alpineállíthatja beContainerFamily:

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

Az előző projektkonfiguráció egy .NET 8-célzási alkalmazás végleges címkéjét 8.0-alpine eredményezi.

Ez a mező szabad formátumú, és gyakran használható különböző operációsrendszer-disztribúciók, alapértelmezett csomagkonfigurációk vagy az alaprendszerkép bármilyen más módosításának kiválasztására. Ezt a mezőt a rendszer figyelmen kívül hagyja, amikor ContainerBaseImage be van állítva. További információ: .NET-tárolórendszerképek.

ContainerRuntimeIdentifier

A tároló futtatókörnyezet-azonosító tulajdonsága szabályozza a tároló által használt operációs rendszert és architektúrát, ha a ContainerBaseImage több platformot is támogat. Például a mcr.microsoft.com/dotnet/runtime rendszerkép jelenleg támogatja linux-x64linux-armazokat, linux-arm64 és win10-x64 a képek mind ugyanazon címke mögött vannak, ezért az eszközkészletnek meg kell adnia, hogy melyik verziót kívánja használni. Alapértelmezés szerint ez annak az értéknek az értéke, amelyet a RuntimeIdentifier tároló közzétételekor választott. Ezt a tulajdonságot ritkán kell explicit módon beállítani – ehelyett használja a -r parancs beállítását dotnet publish . Ha a kiválasztott rendszerkép nem támogatja a RuntimeIdentifier kiválasztott képet, a rendszerkép által támogatott RuntimeIdentifiereket leíró hibaüzenet jelenik meg.

A tulajdonságot mindig beállíthatja ContainerBaseImage teljes képnévre, beleértve a címkét is, hogy egyáltalán ne kelljen használnia ezt a tulajdonságot.

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

A .NET által támogatott futtatókörnyezet-azonosítókkal kapcsolatos további információkért tekintse meg a RID-katalógust.

ContainerRegistry

A tárolóregisztrációs adatbázis tulajdonsága szabályozza a célregisztrációs adatbázist, azt a helyet, ahová az újonnan létrehozott rendszerképet leküldi a rendszer. Alapértelmezés szerint a rendszer leküldi a helyi Docker-démonba, de megadhat egy távoli beállításjegyzéket is. Ha hitelesítést igénylő távoli beállításjegyzéket használ, a hitelesítést a jól ismert docker login mechanizmusok használatával végezheti el. További információt a tárolóregisztrációs adatbázisok hitelesítésével kapcsolatban talál. A tulajdonság használatának konkrét példájához tekintse meg az alábbi XML-példát:

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

Ez az eszközkészlet támogatja a Docker Registry HTTP API V2-t támogató beállításjegyzékben való közzétételt. Ez explicit módon (és valószínűleg több implicit módon) tartalmazza a következő regisztrációs adatbázisokat:

A jegyzékek használatával kapcsolatos jegyzetekért tekintse meg a beállításjegyzék-specifikus jegyzeteket.

ContainerRepository

A tárolóadattár maga a rendszerkép neve, például dotnet/runtimemy-app. A program alapértelmezés szerint a AssemblyName projekt értékét használja.

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

ContainerImageName

A tárolórendszerkép neve maga a rendszerkép neve, például dotnet/runtimemy-appa . A program alapértelmezés szerint a AssemblyName projekt értékét használja.

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

Feljegyzés

A .NET 8-tól ContainerImageName kezdve a rendszer elavult ContainerRepositorya .

A képnevek egy vagy több perjellel tagolt szegmensből állnak, amelyek mindegyike csak kisbetűs alfanumerikus karaktereket, pontokat, aláhúzásjeleket és kötőjeleket tartalmazhat, és betűvel vagy számmal kell kezdődnie. Minden más karakter hibát eredményez.

ContainerImageTag(s)

A tárolórendszerképcímke tulajdonság szabályozza a rendszerképhez létrehozott címkéket. Ha egyetlen címkehasználatot ContainerImageTag és több címkét szeretne megadni, használja a következőt ContainerImageTags:

Fontos

Ha használja ContainerImageTags, több képpel fog végződni, egy egyedi címkével.

A címkék gyakran hivatkoznak az alkalmazások különböző verzióira, de különböző operációsrendszer-disztribúciókra vagy akár különböző konfigurációkra is hivatkozhatnak.

A .NET 8-tól kezdve, ha egy címke nincs megadva, az alapértelmezett érték.latest

Alapértelmezés szerint a Version projekt a címke értéke.

Az alapértelmezett beállítás felülbírálásához adja meg az alábbiak egyikét:

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

Több címke megadásához használjon pontosvesszővel tagolt címkéket a tulajdonságban, hasonlóan a ContainerImageTags többszörös TargetFrameworksbeállításhoz:

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

A címkék legfeljebb 127 alfanumerikus karaktert, pontot, aláhúzásjelet és kötőjelet tartalmazhatnak. A karaktereknek alfanumerikus karakterrel vagy aláhúzásjellel kell kezdődniük. Minden más űrlap hibát eredményez.

Feljegyzés

A használat során ContainerImageTagsa címkéket egy ; karakter tagolja. Ha a parancssorból hív dotnet publish (a legtöbb CI/CD-környezethez hasonlóan), akkor az értékeket egy belső ' körbefuttatásba kell burkolnia dupla idézőjelekkel ", például (='"tag-1;tag-2"'). Vegye figyelembe a következő dotnet publish parancsot:

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

Ez két rendszerképet eredményez: my-app:1.2.3-alpha2 és my-app:latest.

Tipp.

Ha problémákat tapasztal a ContainerImageTags tulajdonsággal kapcsolatban, fontolja meg inkább egy környezeti változó ContainerImageTags hatókörének meghatározását:

ContainerImageTags='1.2.3;latest' dotnet publish

ContainerLabel

A tárolócímke metaadatcímkét ad hozzá a tárolóhoz. A címkék nincsenek hatással a tárolóra futáskor, de gyakran használják a biztonsági szkennerek és más infrastruktúra-eszközök által használt verzió- és metaadatok tárolására. Tetszőleges számú tárolócímkét megadhat.

A ContainerLabel csomópont két attribútummal rendelkezik:

  • Include: A címke kulcsa.
  • Value: A címke értéke (ez üres lehet).
<ItemGroup>
    <ContainerLabel Include="org.contoso.businessunit" Value="contoso-university" />
</ItemGroup>

Az alapértelmezés szerint létrehozott címkék listáját az alapértelmezett tárolófeliratok között találja.

Tárolóvégrehajtás konfigurálása

A tároló végrehajtásának szabályozásához az alábbi MSBuild tulajdonságokat használhatja.

ContainerWorkingDirectory

A tároló munkakönyvtár-csomópontja szabályozza a tároló munkakönyvtárát, azt a könyvtárat, amelyen belül a parancsok futnak, ha nem más parancsok futnak.

Alapértelmezés szerint a /app címtár értékét használja a rendszer munkakönyvtárként.

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

ContainerPort

A tárolóport TCP- vagy UDP-portokat ad hozzá a tároló ismert portjainak listájához. Ez lehetővé teszi, hogy a Dockerhez hasonló tároló-futtatókörnyezetek automatikusan megfeleltetik ezeket a portokat a gazdagépnek. Ezt gyakran használják a tároló dokumentációjaként, de az automatikus portleképezés engedélyezésére is használható.

A ContainerPort csomópont két attribútummal rendelkezik:

  • Include: A közzéteendő portszám.
  • Type: Az alapértelmezett érték, tcpaz érvényes értékek vagy tcpudpa .
<ItemGroup>
    <ContainerPort Include="80" Type="tcp" />
</ItemGroup>

A .NET 8-tól kezdődően a ContainerPort rendszer akkor következtet, ha nem kifejezetten több jól ismert ASP.NET környezeti változó alapján van megadva:

  • ASPNETCORE_URLS
  • ASPNETCORE_HTTP_PORTS
  • ASPNETCORE_HTTPS_PORTS

Ha ezek a környezeti változók jelen vannak, az értékeiket a rendszer elemzi és TCP-portleképezésekké alakítja. Ezek a környezeti változók az alaprendszerképből, ha vannak, vagy a projektben meghatározott környezeti változókból olvasnak be elemeket ContainerEnvironmentVariable . További információ: ContainerEnvironmentVariable.

ContainerEnvironmentVariable

A tároló környezeti változó csomópontja lehetővé teszi környezeti változók hozzáadását a tárolóhoz. A környezeti változók azonnal elérhetők a tárolóban futó alkalmazás számára, és gyakran használják a futó alkalmazás futásidejének módosítására.

A ContainerEnvironmentVariable csomópont két attribútummal rendelkezik:

  • Include: A környezeti változó neve.
  • Value: A környezeti változó értéke.
<ItemGroup>
  <ContainerEnvironmentVariable Include="LOGGER_VERBOSITY" Value="Trace" />
</ItemGroup>

További információ: .NET környezeti változók.

Tárolóparancsok konfigurálása

Alapértelmezés szerint a tárolóeszközök elindítják az alkalmazást az alkalmazáshoz létrehozott AppHost bináris fájllal (ha az alkalmazás AppHostot használ), vagy a dotnet parancsot és az alkalmazás DLL-jét.

Az alkalmazás végrehajtásának módját azonban szabályozhatja az , ContainerAppCommandArgsés ContainerDefaultArgsContainerAppCommandInstructiona ContainerAppCommand.

Ezek a különböző konfigurációs pontok azért léteznek, mert a különböző alaprendszerképek a tároló ENTRYPOINT és COMMAND a tulajdonságok különböző kombinációit használják, és mindegyiket támogatni szeretné. Az alapértelmezett beállításoknak a legtöbb alkalmazáshoz használhatóknak kell lenniük, de ha testre szeretné szabni az alkalmazásindítási viselkedést, tegye a következőt:

  • Azonosítsa a futtatandó bináris fájlt, és állítsa be a következőként: ContainerAppCommand
  • Az alkalmazás futtatásához és beállításához szükséges argumentumok azonosításaContainerAppCommandArgs
  • Határozza meg, hogy mely argumentumok (ha vannak ilyenek ) megadása nem kötelező , és a felhasználó felülírhatja őket, és állítsa be őket ContainerDefaultArgs
  • Állítsa a ContainerAppCommandInstruction elemet DefaultArgs értékre

További információkért tekintse meg a következő konfigurációelemeket.

ContainerAppCommand

Az alkalmazás parancskonfigurációs eleme az alkalmazás logikai belépési pontja. A legtöbb alkalmazás esetében ez az AppHost, az alkalmazáshoz létrehozott végrehajtható bináris fájl. Ha az alkalmazás nem hoz létre AppHost-ot, akkor ez a parancs általában az lesz dotnet <your project dll>. Ezek az értékek az alaptárolóban lévő bármelyik ENTRYPOINT után, vagy közvetlenül akkor lesznek alkalmazva, ha nincs ENTRYPOINT definiálva.

A ContainerAppCommand konfiguráció egyetlen Include tulajdonságot tartalmaz, amely az entrypoint parancsban használandó parancsot, beállítást vagy argumentumot jelöli:

<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

Ez az alkalmazásparancs args konfigurációeleme az alkalmazáshoz logikailag szükséges argumentumokat jelöl, amelyeket alkalmazni kell a ContainerAppCommand. Alapértelmezés szerint egyik sem jön létre egy alkalmazáshoz. Ha jelen van, az argek a tárolóra lesznek alkalmazva a futtatáskor.

A ContainerAppCommandArgs konfiguráció egyetlen Include tulajdonságot tartalmaz, amely a parancsra alkalmazandó ContainerAppCommand lehetőséget vagy argumentumot jelöli.

<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

Ez az alapértelmezett args konfigurációelem az alkalmazás felhasználó által felülírható argumentumait jelöli. Ez egy jó módja annak, hogy olyan alapértelmezett beállításokat biztosítson, amelyeket az alkalmazásnak olyan módon kell futtatnia, amely megkönnyíti az indítást, de mégis könnyen testre szabható.

A ContainerDefaultArgs konfiguráció egyetlen Include tulajdonságot tartalmaz, amely a parancsra alkalmazandó ContainerAppCommand lehetőséget vagy argumentumot jelöli.

<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

Az alkalmazásparancsok utasításkonfigurációja segít szabályozni a ContainerEntrypoint, ContainerEntrypointArgs, , ContainerAppCommand, ContainerAppCommandArgsContainerDefaultArgs és kombinálás módját a tárolóban futtatott utolsó parancs létrehozásához. Ez nagyban függ attól, hogy van-e jelen az ENTRYPOINT alaprendszerképben. Ez a tulajdonság a következő három érték egyikét veszi fel: "DefaultArgs", "Entrypoint"vagy "None".

  • Entrypoint:
    • Ebben a módban a belépési pontot az ContainerAppCommand, ContainerAppCommandArgsés ContainerDefaultArgsa .
  • None:
    • Ebben a módban a belépési pontot az ContainerEntrypoint, ContainerEntrypointArgsés ContainerDefaultArgsa .
  • DefaultArgs:
    • Ez a legösszetettebb mód – ha egyik elem sem ContainerEntrypoint[Args] található meg, akkor a ContainerAppCommand[Args] belépési pont és ContainerDefaultArgs a parancs létrehozására szolgál. Az alaprendszerkép belépésipontja olyan alaprendszerképekhez, amelyekhez a rendszer nehezen kódolt dotnet vagy /usr/bin/dotnet kihagyott, így teljes mértékben szabályozható.
    • Ha mindkettő ContainerEntrypointContainerAppCommand és jelen van, akkor ContainerEntrypoint a belépési pont lesz, és ContainerAppCommand a parancs lesz.

Feljegyzés

A ContainerEntrypoint konfigurációelemek elavultak ContainerEntrypointArgs a .NET 8-as verziójától.

Fontos

Ez a haladó felhasználók számára készült– a legtöbb alkalmazásnak nem kell ilyen mértékben testre szabnia a belépési pontjukat. További információkért és ha használati eseteket szeretne megadni a forgatókönyvekhez, olvassa el a GitHub: .NET SDK-tárolók buildelésére vonatkozó vitafórumokat.

ContainerUser

A felhasználó konfigurációs tulajdonsága vezérli azt az alapértelmezett felhasználót, akiként a tároló fut. Ezt gyakran használják a tároló nemroot felhasználóként való futtatására, ami a biztonság szempontjából ajánlott eljárás. Ennek a konfigurációnak néhány korlátozást figyelembe kell vennie:

  • Különböző űrlapokat vehet fel, például felhasználónevet, linuxos felhasználói azonosítókat, csoportnevet, linuxos csoportazonosítót username:groupnameés egyéb azonosítóvariánsokat.
  • Nincs ellenőrzés arról, hogy a megadott felhasználó vagy csoport létezik-e a képen.
  • A felhasználó módosítása megváltoztathatja az alkalmazás viselkedését, különösen a fájlrendszer engedélyeit illetően.

A mező alapértelmezett értéke a projekt TFM-étől és a cél operációs rendszertől függően változik:

  • Ha a .NET 8-at vagy újabb verziót célozza meg, és a Microsoft futtatókörnyezeti rendszerképeket használja, akkor:
    • Linux rendszeren a rendszer a gyökér nélküli felhasználót app használja (bár a felhasználóazonosítója hivatkozik rá)
    • Windows rendszeren a rendszer a gyökér nélküli felhasználót ContainerUser használja
  • Ellenkező esetben a rendszer nem használja az alapértelmezett értéket ContainerUser
<PropertyGroup>
  <ContainerUser>my-existing-app-user</ContainerUser>
</PropertyGroup>

Tipp.

A APP_UID környezeti változó a tároló felhasználói adatainak beállítására szolgál. Ez az érték származhat az alaprendszerképben definiált környezeti változókból (ahogyan a Microsoft .NET-rendszerképek teszik), vagy beállíthatja saját maga is a ContainerEnvironmentVariable szintaxison keresztül.

Az alkalmazás végrehajtásának módját azonban szabályozhatja az és ContainerEntrypointArgsa használatávalContainerEntrypoint.

ContainerEntrypoint

A tárolóbeléptetési pont segítségével testre szabhatja a ENTRYPOINT tárolót, amely a tároló indításakor meghívható végrehajtható. Alapértelmezés szerint az alkalmazás-gazdagépet létrehozó buildek esetében ez a beállítás az ContainerEntrypoint. Olyan buildek esetében, amelyek nem hoznak létre végrehajtható fájlokat, a rendszer a dotnet path/to/app.dllContainerEntrypoint.

A ContainerEntrypoint csomópont egyetlen attribútummal rendelkezik:

  • Include: A parancsban ContainerEntrypoint használni kívánt parancs, beállítás vagy argumentum.

Vegyük például a következő minta .NET-projektelemcsoportot:

<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

A tárolóbeléptetési pont args csomópontja szabályozza a megadott alapértelmezett argumentumokat ContainerEntrypoint. Ezt akkor érdemes használni, ha a ContainerEntrypoint felhasználó egy olyan programot szeretne használni, amelyet a felhasználó önállóan szeretne használni. Alapértelmezés szerint nem ContainerEntrypointArgs jön létre az Ön nevében.

A ContainerEntrypointArg csomópont egyetlen attribútummal rendelkezik:

  • Include: A parancsra ContainerEntrypoint alkalmazandó beállítás vagy argumentum.

Tekintse meg a következő .NET-projektelemcsoportot:

<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>

Alapértelmezett tárolófeliratok

A címkék gyakran konzisztens metaadatokat biztosítanak a tárolólemezképeken. Ez a csomag néhány alapértelmezett címkét biztosít a létrehozott képek jobb karbantarthatóságának elősegítése érdekében.

  • org.opencontainers.image.created az aktuális UTC DateTimeISO 8601 formátumára van beállítva.

További információ: Hagyományos címkék implementálása a meglévő címkeinfrastruktúra tetején.

Az erőforrások eltávolítása

Ebben a cikkben egy .NET-feldolgozót tett közzé tárolórendszerképként. Ha szeretné, törölje ezt az erőforrást. A parancs használatával megtekintheti a docker images telepített rendszerképek listáját.

docker images

Vegye figyelembe a következő példakimenetet:

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

Tipp.

A képfájlok nagy méretűek lehetnek. Általában eltávolítaná az alkalmazás tesztelése és fejlesztése során létrehozott ideiglenes tárolókat. Az alaprendszerképeket általában a futtatókörnyezettel együtt kell tárolnia, ha az adott futtatókörnyezet alapján más rendszerképeket szeretne készíteni.

A rendszerkép törléséhez másolja ki a képazonosítót, és futtassa a docker image rm parancsot:

docker image rm 25aeb97a2e21

Következő lépések