Delen via


Overzicht van het maken van .NET SDK-containers

Hoewel het mogelijk is om .NET-apps te containeriseren met een Dockerfile-, zijn er aantrekkelijke redenen voor apps rechtstreeks te containeriseren met de .NET SDK-. Dit artikel bevat een overzicht van de functie voor het maken van .NET SDK-containers, met details met betrekking tot telemetrie, publicatieoverwegingen, buildeigenschappen en verificatie voor containerregisters.

Overwegingen bij het publiceren van projecten

Nu u een .NET-app hebt, kunt u deze publiceren als een container. Voordat u dit doet, zijn er verschillende belangrijke overwegingen waarmee u rekening moet houden. Vóór .NET SDK versie 8.0.200 hebt u het 📦 Microsoft.NET.Build.Containers NuGet-pakket nodig. Dit pakket is niet vereist voor .NET SDK-versie 8.0.200 en hoger, omdat de containerondersteuning standaard is opgenomen.

Als u het publiceren van een .NET-app als container wilt inschakelen, zijn de volgende build-eigenschappen vereist:

  • IsPublishable: Ingesteld op true. Deze eigenschap is impliciet ingesteld op true voor uitvoerbare projecttypen, zoals console, webappen worker.
  • EnableSdkContainerSupport: ingesteld op true wanneer uw projecttype een console-app is.

Als u sdk-containerondersteuning expliciet wilt inschakelen, kunt u het volgende projectbestandsfragment overwegen:

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

Schakelopties en build-eigenschappen publiceren

Net als bij alle .NET CLI-opdrachten kunt u MSBuild-eigenschappen opgeven op de opdrachtregel. Er zijn veel geldige syntaxisformulieren beschikbaar om eigenschappen op te geven, zoals:

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

U kunt de gewenste syntaxis gebruiken, maar in de documentatie worden voorbeelden weergegeven met behulp van het formulier -p.

Tip

Voor hulp bij het oplossen van problemen kunt u de MSBuid-logboeken gebruiken. Als u een binlog-bestand (binlog) wilt genereren, voegt u de -bl schakeloptie toe aan de opdracht dotnet publish. Binlog-bestanden zijn handig voor het diagnosticeren van buildproblemen en kunnen worden geopend in de MSBuild Structured Log Viewer. Ze bieden een gedetailleerde tracering van het buildproces, essentieel voor MSBuild-analyse. Zie Problemen oplossen en logboeken maken voor MSBuildvoor meer informatie.

Profielen en doelen publiceren

Wanneer u dotnet publishgebruikt, kunt u een profiel opgeven met -p PublishProfile=DefaultContainer, een eigenschap instellen waardoor de SDK na het publicatieproces een ander doelwit activeert. Dit is een indirecte manier om het gewenste resultaat te bereiken. Aan de andere kant roept het gebruik van dotnet publish /t:PublishContainer het PublishContainer doel rechtstreeks aan, waardoor hetzelfde resultaat wordt bereikt, maar op een eenvoudigere manier.

Met andere woorden, de volgende .NET CLI-opdracht:

dotnet publish -p PublishProfile=DefaultContainer

Hiermee wordt de eigenschap PublishProfile ingesteld op DefaultContainer, is gelijk aan de volgende opdracht:

dotnet publish /t:PublishContainer

Het verschil tussen de twee methoden is dat de eerste een profiel gebruikt om de eigenschap in te stellen, terwijl de laatste het doel rechtstreeks aanroept. De reden hiervoor is dat profielen een functie van MSBuild zijn en ze kunnen worden gebruikt om eigenschappen op een complexere manier in te stellen dan ze rechtstreeks in te stellen.

Een belangrijk probleem is dat niet alle projecttypen profielen ondersteunen of dezelfde set profielen beschikbaar hebben. Daarnaast is er een verschil in het ondersteuningsniveau voor profielen tussen verschillende hulpprogramma's, zoals Visual Studio en de .NET CLI. Daarom is het gebruik van doelen over het algemeen een duidelijkere en meer ondersteunde methode om hetzelfde resultaat te bereiken.

Authenticeren bij containerregisters

Voor interactie met privécontainerregisters is verificatie met deze registers vereist.

Docker heeft een vastgesteld patroon met dit via de docker login-opdracht. Dit is een manier om te communiceren met een Docker-configuratiebestand dat regels bevat voor verificatie met specifieke registers. Dit bestand en de verificatietypen die worden gecodeerd, worden ondersteund door Microsoft.Net.Build.Containers voor registerverificatie. Dit moet ervoor zorgen dat dit pakket naadloos werkt met elk register dat u kunt docker pull van en docker push. Dit bestand wordt normaal gesproken opgeslagen op ~/.docker/config.json, maar het kan ook worden opgegeven via de DOCKER_CONFIG variabele, die verwijst naar een map met een config.json bestand.

Soorten verificatie

Het bestand config.json bevat drie soorten verificatie:

Expliciete gebruikersnaam/wachtwoord

De auths sectie van het bestand config.json is een sleutel/waardetoewijzing tussen registernamen en met Base64 gecodeerde gebruikersnaam:wachtwoordtekenreeksen. In een veelvoorkomend Docker-scenario maakt het uitvoeren van docker login <registry> -u <username> -p <password> nieuwe items in deze kaart. Deze referenties zijn populair in CI-systemen (continue integratie), waarbij aanmelding wordt uitgevoerd door tokens aan het begin van een uitvoering. Ze zijn echter minder populair voor ontwikkelcomputers van eindgebruikers vanwege het beveiligingsrisico dat er nauwelijks referenties in een bestand voorkomen.

Helpers voor referenties

De credHelpers sectie van het bestand config.json is een sleutel/waardetoewijzing tussen registernamen en de namen van specifieke programma's die kunnen worden gebruikt om referenties voor dat register te maken en op te halen. Dit wordt vaak gebruikt wanneer bepaalde registers complexe verificatievereisten hebben. Als u dit type verificatie wilt laten werken, moet u een toepassing hebben met de naam docker-credential-{name} op de PATHvan uw systeem. Dit soort inloggegevens is geneigd veilig te zijn, maar kan lastig zijn om in te stellen op ontwikkel- of CI-machines.

Systeemwachtwoordbeheer

De sectie credsStore is een tekenreekseigenschap waarvan de waarde de naam is van een Docker-inloggegevenshulpprogramma dat kan communiceren met het wachtwoordbeheer van het systeem. Voor Windows kan dit bijvoorbeeld wincred zijn. Deze zijn populair bij Docker-installatieprogramma's voor macOS en Windows.

Verificatie via omgevingsvariabelen

In sommige scenario's volstaat het standaard Docker-authenticatiemechanisme dat hierboven is beschreven niet. Deze hulpprogramma's hebben een extra mechanisme voor het opgeven van referenties voor registers: omgevingsvariabelen. Als omgevingsvariabelen worden gebruikt, wordt het mechanisme voor referentiegegevens helemaal niet gebruikt. De volgende omgevingsvariabelen worden ondersteund:

  • DOTNET_CONTAINER_REGISTRY_UNAME: dit moet de gebruikersnaam voor het register zijn. Als het wachtwoord voor het register een token is, moet de gebruikersnaam worden "<token>".
  • DOTNET_CONTAINER_REGISTRY_PWORD: dit moet het wachtwoord of token voor het register zijn.

Notitie

Vanaf .NET SDK 8.0.400 zijn de omgevingsvariabelen voor containerbewerkingen bijgewerkt. De SDK_CONTAINER_* variabelen worden nu voorafgegaan door DOTNET_CONTAINER_*.

Dit mechanisme is mogelijk kwetsbaar voor het lekken van referenties, dus moet dit alleen worden gebruikt in scenario's waarin het andere mechanisme niet beschikbaar is. Als u bijvoorbeeld de SDK-containerhulpprogramma's in een Docker-container zelf gebruikt. Daarnaast is dit mechanisme niet naamruimtelijk. Het probeert dezelfde referenties te gebruiken voor zowel het bronregister (waar uw basisinstallatiekopieën zich bevinden) als het doelregister (waar u de uiteindelijke installatiekopieën pusht).

Onveilige registers gebruiken

De meeste toegang tot het register wordt verondersteld veilig te zijn, wat betekent dat HTTPS wordt gebruikt voor interactie met het register. Niet alle registers worden echter geconfigureerd met TLS-certificaten, met name in situaties zoals een persoonlijk bedrijfsregister achter een VPN. Ter ondersteuning van deze use cases bieden containerhulpprogramma's manieren om te declareren dat een specifiek register onveilige communicatie gebruikt.

Vanaf .NET 8.0.400 begrijpt de SDK deze configuratiebestanden en -indelingen en gebruikt deze configuratie automatisch om te bepalen of HTTP of HTTPS moet worden gebruikt. Het configureren van een register voor onveilige communicatie varieert op basis van uw containerhulpprogramma naar keuze.

Docker

Docker slaat de registerconfiguratie op in de daemon-configuratie. Als u nieuwe onveilige registers wilt toevoegen, worden nieuwe hosts toegevoegd aan de eigenschap "insecure-registries" matrix:

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

Notitie

U moet de Docker-daemon opnieuw starten om wijzigingen in dit bestand toe te passen.

Podman

Podman maakt gebruik van een registries.conf TOML-bestand voor het opslaan van registerverbindingsgegevens. Dit bestand bevindt zich meestal op /etc/containers/registries.conf. Als u nieuwe onveilige registers wilt toevoegen, wordt er een TOML-sectie toegevoegd om de instellingen voor het register op te slaan. De optie insecure moet worden ingesteld op true.

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

Notitie

U moet Podman opnieuw starten om wijzigingen toe te passen op het bestand registries.conf.

Omgevingsvariabelen

Vanaf 9.0.100 herkent de .NET SDK onveilige registers die worden doorgegeven via de omgevingsvariabele DOTNET_CONTAINER_INSECURE_REGISTRIES. Deze variabele gebruikt een door komma's gescheiden lijst met domeinen om te behandelen als onveilig op dezelfde manier als de bovenstaande Docker- en Podman-voorbeelden.

$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

Telemetrie

Wanneer u een .NET-app publiceert als een container, verzamelt en verzendt de .NET SDK-containerhulpprogramma's gebruikstelemetrie over hoe de hulpprogramma's worden gebruikt. De verzamelde gegevens zijn naast de telemetrie die wordt verzonden door de .NET CLI, en maakt daarnaast gebruik van dezelfde mechanismen en, wat belangrijk is, voldoet aan dezelfde opt-out-opties.

De verzamelde telemetrie is bedoeld om algemeen van aard te zijn en geen persoonlijke gegevens te lekken. Het beoogde doel is om te meten:

  • Het gebruik van de .NET SDK-containerisatiefunctie over het algemeen.
  • Succes- en mislukkingspercentages, samen met algemene informatie over welke soorten fouten het vaakst optreden.
  • Gebruik van specifieke functies van de technologie, zoals publiceren naar verschillende registertypen of hoe de publicatie is aangeroepen.

Als u zich wilt afmelden voor telemetrie, stelt u de omgevingsvariabele DOTNET_CLI_TELEMETRY_OPTOUT in op true. Zie .NET CLI-telemetrievoor meer informatie.

Telemetrie van inferentie

De volgende informatie over hoe het inferentieproces van de basisafbeelding heeft plaatsgevonden, wordt vastgelegd:

Datumpunt Uitleg Voorbeeldwaarde
InferencePerformed Als gebruikers handmatig basisafbeeldingen opgeven in plaats van gebruikmaken van inferentie. true
TargetFramework De TargetFramework gekozen bij de inferentie van de basisafbeelding. net8.0
BaseImage De waarde van de gekozen basisafbeelding, maar alleen als die basisafbeelding een van de door Microsoft geproduceerde afbeeldingen is. Als een gebruiker een andere afbeelding dan de door Microsoft geproduceerde afbeeldingen op mcr.microsoft.com opgeeft, is deze waarde null. mcr.microsoft.com/dotnet/aspnet
BaseImageTag De waarde van de gekozen tag, maar alleen als die tag voor een van de door Microsoft geproduceerde afbeeldingen is. Als een gebruiker een andere afbeelding opgeeft dan de door Microsoft geproduceerde afbeeldingen op mcr.microsoft.com, is deze waarde null. 8.0
ContainerFamily De waarde van de eigenschap ContainerFamily wanneer een gebruiker de functie ContainerFamily gebruikt heeft om een 'smaak' van een van onze basisafbeeldingen te kiezen. Dit wordt alleen ingesteld als de gebruiker een van de door Microsoft geproduceerde .NET-afbeeldingen van mcr.microsoft.com heeft gekozen of afgeleid uit deze keuze. jammy-chiseled
ProjectType Het soort project dat in een container wordt geplaatst. AspNetCore of Console
PublishMode Hoe de toepassing is verpakt. Aot, Trimmed, SelfContainedof FrameworkDependent
IsInvariant Als voor de gekozen afbeelding globale onveranderlijkheid is vereist of als de gebruiker hier handmatig voor heeft gekozen. true
TargetRuntime De RID waarvoor deze toepassing is gepubliceerd. linux-x64

Telemetrie voor het maken van afbeeldingen

Volgende informatie over de totstandkoming en publicatie van containers is vastgelegd:

Datumpunt Uitleg Voorbeeldwaarde
RemotePullType Als de basisafbeelding afkomstig was uit een extern register, wat voor soort register was het? Azure, AWS, Google, GitHub, DockerHub, MRC of Other
LocalPullType Als de basisafbeelding afkomstig is van een lokale bron, zoals een containerdemon of een tarball. Docker, Podman, Tarball
RemotePushType Als de afbeelding naar een extern register werd gepusht, wat voor soort register was het? Azure, AWS, Google, GitHub, DockerHub, MRC of Other
LocalPushType Als het image naar een lokale bestemming werd gepusht, wat was het dan? Docker, Podman, Tarball

Bovendien, als er verschillende soorten fouten optreden tijdens het proces dat gegevens worden verzameld over wat voor soort fout het was:

Datumpunt Uitleg Voorbeeldwaarde
Error Het type fout dat is opgetreden unknown_repository, credential_failure, rid_mismatch, local_load.
Direction Als de fout een credential_failureis, was het in het push- of pull-register? push
Doel RID Als de fout een rid_mismatchwas, welke RID is aangevraagd linux-x64
Beschikbare RID's Als de fout een rid_mismatchwas, welke RIDs ondersteunde de basisafbeelding? linux-x64,linux-arm64

Zie ook