Megosztás a következőn keresztül:


.NET SDK-tároló létrehozása – áttekintés

Bár lehet a .NET-alkalmazásokat tárolóba helyezni Dockerfile-segítségével, a .NET SDK-közvetlen használatával végzett alkalmazások tárolását meggyőző érvek támasztják alá. Ez a cikk áttekintést nyújt a .NET SDK tárolólétrehozási funkcióról, a telemetriával, a közzétételi szempontokkal, a buildtulajdonságokkal és a tárolóregisztrációs adatbázisok hitelesítésével kapcsolatos részletekkel.

Projektekkel kapcsolatos szempontok közzététele

Most, hogy rendelkezik .NET-alkalmazással, közzéteheti tárolóként. Mielőtt ezt megtenénk, több fontos szempontot is szem előtt kell tartani. A .NET SDK 8.0.200-es verziója előtt szüksége volt a 📦 Microsoft.NET.Build.Containers NuGet-csomagra. Ez a csomag nem szükséges a .NET SDK 8.0.200-as és újabb verziójához, mivel alapértelmezés szerint a tárolótámogatás is elérhető.

A .NET-alkalmazások tárolóként való közzétételének engedélyezéséhez a következő buildtulajdonságokra van szükség:

  • IsPublishable: Beállítva: true. Ez a tulajdonság implicit módon van beállítva true-ra a végrehajtható projekttípusokhoz, például console, webappés worker.
  • EnableSdkContainerSupport: Állítsa true, ha a projekttípus konzolalkalmazás.

Az SDK-tároló támogatásának explicit engedélyezéséhez vegye figyelembe a következő projektfájl-kódrészletet:

<PropertyGroup>
  <IsPublishable>true</IsPublishable>
  <EnableSdkContainerSupport>true</EnableSdkContainerSupport>
</PropertyGroup>

Kapcsolók közzététele és tulajdonságok létrehozása

Az összes .NET CLI-parancshoz hasonlóan az MSBuild tulajdonságokat is megadhatja a parancssorban. Számos érvényes szintaxisűrlap érhető el a tulajdonságok megadásához, például:

  • /p:PropertyName=Value
  • -p:PropertyName=Value
  • -p PropertyName=Value
  • --property PropertyName=Value

Tetszőleges szintaxist használhat, de a dokumentáció példákat mutat be az -p űrlap használatával.

Borravaló

A hibaelhárításhoz fontolja meg az MSBuid-naplók használatát. Bináris naplófájl (binlog) létrehozásához adja hozzá a -bl kapcsolót a dotnet publish parancshoz. A binlogfájlok hasznosak a buildelési problémák diagnosztizálásához, és az MSBuild Structured Log Viewernyithatók meg. Részletes nyomkövetést nyújtanak a buildelési folyamatról, amely elengedhetetlen az MSBuild-elemzéshez. További információ: Az MSBuild naplóinak hibaelhárítása és létrehozása.

Profilok és célok közzététele

A dotnet publishhasználatakor egy profil -p PublishProfile=DefaultContainer megadásával olyan tulajdonságot állíthat be, amely miatt az SDK egy másik célt aktivál a közzétételi folyamat után. Ez a kívánt eredmény elérésének közvetett módja. Másrészt a dotnet publish /t:PublishContainer használata közvetlenül meghívja a PublishContainer célt, és ugyanazt az eredményt éri el, de egyszerűbben.

Más szóval a következő .NET CLI-parancs:

dotnet publish -p PublishProfile=DefaultContainer

A PublishProfile tulajdonságot DefaultContainerértékre állítja, egyenértékű a következő paranccsal:

dotnet publish /t:PublishContainer

A két módszer közötti különbség az, hogy az előbbi profillal állítja be a tulajdonságot, míg az utóbbi közvetlenül meghívja a célt. Ennek az az oka, hogy a profilok az MSBuild egyik funkciója, és a tulajdonságok összetettebb beállítására használhatók, mint a közvetlen beállításuk.

Az egyik fő probléma az, hogy nem minden projekttípus támogatja a profilokat, vagy ugyanazzal a profilkészlettel rendelkezik. Emellett a különböző eszközök, például a Visual Studio és a .NET parancssori felület közötti profilok támogatásának szintje is eltérő. Ezért a célok használata általában egyértelműbb és szélesebb körben támogatott módszer ugyanazon eredmény eléréséhez.

Hitelesítés tárolóregisztrációs adatbázisokban

A privát tárolóregisztrációs adatbázisokkal való interakcióhoz hitelesítésre van szükség ezekkel a regisztrációs adatbázisokkal.

A Docker a docker login paranccsal rendelkezik egy létrehozott mintával, amely egy Docker-konfigurációs fájllal való interakció egyik módja, amely szabályokat tartalmaz az adott adatbázisokkal való hitelesítéshez. Ezt a fájlt és a kódolt hitelesítési típusokat a Microsoft.Net.Build.Containers támogatja a beállításjegyzék-hitelesítéshez. Ennek biztosítania kell, hogy ez a csomag zökkenőmentesen működjön bármilyen nyilvántartással, amelyből docker pull és docker push. Ezt a fájlt általában a ~/.docker/config.jsontárolja, de a változón keresztül DOCKER_CONFIG is megadható, amely egy config.json fájlt tartalmazó könyvtárra mutat.

A hitelesítés típusai

A config.json fájl háromféle hitelesítést tartalmaz:

Explicit felhasználónév/jelszó

A authsconfig.json fájl szakasza egy kulcs/érték térkép a rendszerleíró adatbázis nevei és a Base64-kódolt felhasználónév:jelszó karakterláncok között. Egy gyakori Docker-forgatókönyvben a docker login <registry> -u <username> -p <password> futtatása új elemeket hoz létre ebben a térképben. Ezek a hitelesítő adatok népszerűek a folyamatos integrációs (CI) rendszerekben, ahol a bejelentkezés tokenekkel történik a futtatás elején. A végfelhasználói fejlesztőgépek esetében azonban kevésbé népszerűek, mivel biztonsági kockázatot jelentenek, ha a fájlokban nem található hitelesítő adatok.

Hitelesítő segítők

A credHelpers fájl config.json szakasza kulcs/érték párok térképe, amely összekapcsolja a bejegyzések neveit és azon programok nevét, amelyek használhatók a bejegyzés hitelesítő adatainak létrehozására és lekérésére. Ezt gyakran akkor használják, ha bizonyos regisztrációs adatbázisok összetett hitelesítési követelményekkel rendelkeznek. Ahhoz, hogy ez a fajta hitelesítés működjön, rendelkeznie kell a rendszerének egy docker-credential-{name} nevű alkalmazással a PATH-on. Az ilyen típusú hitelesítő adatok általában biztonságosak, de a fejlesztési vagy CI-gépeken nehéz lehet beállítani őket.

Rendszerkulcsláncok

A credsStore szakasz egyetlen sztringtulajdonság, amelynek értéke egy docker hitelesítőadat-kezelő program neve, amely tudja, hogyan kell csatlakozni a rendszer jelszókezelőjével. Windows esetén ez lehet például wincred. Ezek népszerűek a Docker macOS- és Windows-telepítőiben.

Hitelesítés környezeti változókon keresztül

Bizonyos esetekben a fent leírt standard Docker-hitelesítési mechanizmus egyszerűen nem elég. Ez az eszközkészlet egy további mechanizmussal rendelkezik a regisztrációs adatbázisok hitelesítő adatainak biztosítására: környezeti változók. Környezeti változók használata esetén a hitelesítő adatok megadására szolgáló mechanizmus egyáltalán nem lesz használatban. A következő környezeti változók támogatottak:

  • DOTNET_CONTAINER_REGISTRY_UNAME: Ennek a regisztrációnak ez kell legyen a felhasználóneve. Ha a beállításjegyzék jelszava jogkivonat, akkor a felhasználónévnek "<token>"kell lennie.
  • DOTNET_CONTAINER_REGISTRY_PWORD: Ennek kell lennie a regisztráció jelszavának vagy tokenjének.

Jegyzet

A .NET SDK 8.0.400-as verziójától a tárolóműveletek környezeti változói frissültek. A SDK_CONTAINER_* változók mostantól DOTNET_CONTAINER_*előtaggal vannak elnevezettek.

Ez a mechanizmus potenciálisan sebezhető a hitelesítő adatok szivárgásával szemben, ezért csak olyan helyzetekben szabad használni, ahol a másik mechanizmus nem érhető el. Ha például az SDK eszközkészletet egy Docker-tárolón belül használja. Emellett ez a mechanizmus nem névtérrel van elosztva – ugyanazt a hitelesítő adatokat próbálja használni a forrásregisztrációs adatbázishoz (ahol az alaprendszerkép található) és a célregisztrációs adatbázishoz (ahol a végső rendszerképet küldi).

Nem biztonságos nyilvántartások használata

A legtöbb beállításjegyzék-hozzáférés biztonságosnak minősül, ami azt jelenti, hogy a HTTPS a beállításjegyzékkel való interakcióra szolgál. Azonban nem minden regisztrációs adatbázis van TLS-tanúsítványokkal konfigurálva – különösen olyan helyzetekben, mint a VPN mögötti privát vállalati regisztrációs adatbázis. Ezeknek a használati eseteknek a támogatásához a tárolóeszközök lehetővé teszik annak deklarálását, hogy egy adott beállításjegyzék nem biztonságos kommunikációt használ.

A .NET 8.0.400-tól kezdve az SDK megérti ezeket a konfigurációs fájlokat és formátumokat, és automatikusan ezt a konfigurációt használja annak meghatározására, hogy HTTP vagy HTTPS protokollt kell-e használni. A beállításjegyzék nem biztonságos kommunikációra való konfigurálása a tárolóeszköztől függően változik.

Kikötőmunkás

A Docker a beállításjegyzék konfigurációját a démonkonfigurációban tárolja. Új nem biztonságos regisztrációs adatbázisok hozzáadásához a rendszer új gazdagépeket ad hozzá a "insecure-registries" tömbtulajdonsághoz:

{
  "insecure-registries": [
    "registry.mycorp.net"
  ]
}

Jegyzet

A fájl módosításainak alkalmazásához újra kell indítania a Docker-démont.

Podman

A Podman egy registries.conf TOML-fájlt használ a beállításjegyzék kapcsolati adatainak tárolására. Ez a fájl általában a /etc/containers/registries.conf-nál található. Új nem biztonságos regisztrációs adatbázisok hozzáadásához a rendszer hozzáad egy TOML-szakaszt a beállításjegyzék beállításainak tárolásához, majd a insecure beállítást trueértékre kell állítani.

[[registry]]
location = "registry.mycorp.net"
insecure = true

Jegyzet

A registries.conf fájl módosításainak alkalmazásához újra kell indítania a Podmant.

Környezeti változók

A 9.0.100-tól kezdődően a .NET SDK felismeri a DOTNET_CONTAINER_INSECURE_REGISTRIES környezeti változón áthaladó nem biztonságos adatbázisokat. Ez a változó a tartományok vesszővel tagolt listáját úgy kezeli, hogy nem biztonságos, ugyanúgy, mint a Docker és a Podman fenti példái.

$Env:DOTNET_CONTAINER_INSECURE_REGISTRIES=localhost:5000,registry.mycorp.com; dotnet publish -t:PublishContainer -p:ContainerRegistry=registry.mycorp.com -p:ContainerBaseImage=localhost:5000/dotnet/runtime:9.0

Telemetria

Amikor tárolóként tesz közzé egy .NET-alkalmazást, a .NET SDK tárolóeszközei használati telemetriát gyűjtenek és küldenek az eszközök használatáról. Az összegyűjtött adatok a .NET CLIáltal küldött telemetriai adatok mellett vannak, de ugyanazokat a mechanizmusokat használják, és ami a legfontosabb, ugyanazokat a letiltási vezérlőketalkalmazzák.

Az összegyűjtött telemetriai adatok általános jellegűek, és nem szivárognak ki személyes adatok – a cél a mérés elősegítése:

  • A .NET SDK tárolóizációs funkciójának általános használata.
  • Sikerességi és hibaarányok, valamint általános információk arról, hogy milyen típusú hibák történnek leggyakrabban.
  • A technológia bizonyos funkcióinak használata, mint például a különböző beállításjegyzék-típusok közzététele, vagy a közzététel végrehajtásának módja.

A telemetria kikapcsolásához állítsa a DOTNET_CLI_TELEMETRY_OPTOUT környezeti változót trueértékre. További információ: .NET CLI-telemetria.

Következtetési telemetria

A rendszer a következő információkat naplózza az alaprendszerkép következtetési folyamatáról:

Időpont Magyarázat Mintaérték
InferencePerformed Ha a felhasználók manuálisan adják meg az alaprendszerképeket, és nem a következtetést használják. true
TargetFramework Az alapkép inferencia során kiválasztott TargetFramework. net8.0
BaseImage A kiválasztott alaprendszerkép értéke, de csak akkor, ha az alaprendszerkép a Microsoft által készített rendszerképek egyike. Ha egy felhasználó a mcr.microsoft.com-ra bármilyen más képet ad meg, mint a Microsoft által készített képek, ez az érték null. mcr.microsoft.com/dotnet/aspnet
BaseImageTag A kiválasztott címke értéke, de csak akkor, ha ez a címke a Microsoft által létrehozott képek egyikére vonatkozik. Ha egy felhasználó a mcr.microsoft.com-ra bármilyen más képet ad meg, mint a Microsoft által készített képek, ez az érték null. 8.0
ContainerFamily A ContainerFamily tulajdonság értéke, ha egy felhasználó a ContainerFamily funkcióval választotta ki az egyik alaprendszerkép "ízét". Ez csak akkor van beállítva, ha a felhasználó kiválasztott vagy következtetett egy Microsoft által készített .NET képet az mcr.microsoft.com webhelyről. jammy-chiseled
ProjectType A konténerizált projekt típusa. AspNetCore vagy Console
PublishMode Az alkalmazás csomagolásának menete. Aot, Trimmed, SelfContainedvagy FrameworkDependent
IsInvariant Ha a kiválasztott rendszerkép invariáns globalizációt igényel, vagy a felhasználó manuálisan választotta. true
TargetRuntime Az a RID, amelyhez az alkalmazást publikálták. linux-x64

Képlétrehozás telemetriai adatai

A tárolólétrehozási és -közzétételi folyamat folyamatának naplózása a következő információkat tartalmazza:

Időpont Magyarázat Mintaérték
RemotePullType Ha az alaprendszerkép egy távoli beállításjegyzékből származik, milyen típusú beállításjegyzék volt? Azure, AWS, Google, GitHub, DockerHub, MRC vagy egyéb
LocalPullType Ha az alapkép helyi forrásból származik, például egy konténer démonról vagy tarballról. Docker, Podman, Tarball
RemotePushType Ha az image-et feltöltötték egy távoli regisztrárba, milyen típusú regisztrár volt? Azure, AWS, Google, GitHub, DockerHub, MRC vagy egyéb
LocalPushType Ha a képet egy helyi célpontba helyezték, mi lett az? Docker, Podman, Tarball

Ezenkívül, ha a folyamat során különböző típusú hibák lépnek fel, adatokat gyűjtenek arról, hogy pontosan milyen hiba történt.

Időpont Magyarázat Mintaérték
Error A bekövetkezett hiba típusa unknown_repository, credential_failure, rid_mismatch. local_load
Direction Ha a hiba egy credential_failure, akkor a leküldéses vagy lekéréses beállításjegyzékben történt? push
Cél RID Ha a hiba rid_mismatchvolt, melyik RID-et kérték? linux-x64
Elérhető RID-k Ha a hiba egy rid_mismatchvolt, mely RID-eket támogatott az alapértelmezett képfájl? linux-x64,linux-arm64

Lásd még: