.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:
- .NET 8+ SDK
Ha telepítve van a .NET, adotnet --info
paranccsal állapítsa meg, hogy melyik SDK-t használja. - Docker Community Edition
- .NET 7+ SDK
Ha telepítve van a .NET, adotnet --info
paranccsal állapítsa meg, hogy melyik SDK-t használja. - Docker Community Edition
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 console
worker
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 ContainerArchiveOutputPath
dotnet 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.gz
megadni. 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 auser/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 TargetFramework
elem 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-x64
linux-arm
azokat, 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:
- Azure Container Registry
- Amazon Elastic Container Registry
- Google Artifact Registry
- Docker Hub
- GitHub Packages
- GitLab által üzemeltetett tárolóregisztrációs adatbázis
- Quay.io
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/runtime
my-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/runtime
my-app
a . 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 ContainerRepository
a .
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 TargetFrameworks
beá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 ContainerImageTags
a 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,tcp
az érvényes értékek vagytcp
udp
a .
<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 ContainerDefaultArgs
ContainerAppCommandInstruction
a 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ása
ContainerAppCommandArgs
- 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
elemetDefaultArgs
é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
, ContainerAppCommandArgs
ContainerDefaultArgs
é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
ésContainerDefaultArgs
a .
- Ebben a módban a belépési pontot az
None
:- Ebben a módban a belépési pontot az
ContainerEntrypoint
,ContainerEntrypointArgs
ésContainerDefaultArgs
a .
- Ebben a módban a belépési pontot az
DefaultArgs
:- Ez a legösszetettebb mód – ha egyik elem sem
ContainerEntrypoint[Args]
található meg, akkor aContainerAppCommand[Args]
belépési pont ésContainerDefaultArgs
a parancs létrehozására szolgál. Az alaprendszerkép belépésipontja olyan alaprendszerképekhez, amelyekhez a rendszer nehezen kódoltdotnet
vagy/usr/bin/dotnet
kihagyott, így teljes mértékben szabályozható. - Ha mindkettő
ContainerEntrypoint
ContainerAppCommand
és jelen van, akkorContainerEntrypoint
a belépési pont lesz, ésContainerAppCommand
a parancs lesz.
- Ez a legösszetettebb mód – ha egyik elem sem
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
- Linux rendszeren a rendszer a gyökér nélküli felhasználót
- 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 ContainerEntrypointArgs
a 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.dll
ContainerEntrypoint
.
A ContainerEntrypoint
csomópont egyetlen attribútummal rendelkezik:
Include
: A parancsbanContainerEntrypoint
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 parancsraContainerEntrypoint
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 UTCDateTime
ISO 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
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: