Novità dei contenitori per .NET 8

Questo articolo descrive le nuove funzionalità nei contenitori per .NET 8.

Immagini del contenitore

Sono state apportate le modifiche seguenti alle immagini dei contenitori .NET per .NET 8:

Utente non-root

Le immagini includono un utente non-root. Con questo utente le immagini possono supportare l'esecuzione non-root. Per l'esecuzione come non-root, aggiungere la riga seguente alla fine del Dockerfile (o un'istruzione simile nei manifesti Kubernetes):

USER app

.NET 8 aggiunge una variabile di ambiente per l'UID per l'utente non-root, ovvero 64198. Questa variabile di ambiente è utile per il test runAsNonRoot Kubernetes, che richiede che l'utente del contenitore sia impostato tramite UID e non con il nome. Questo dockerfile mostra un esempio di utilizzo.

Anche la porta predefinita è stata cambiata dalla porta 80 alla porta 8080. Per supportare questa modifica, è disponibile la nuova variabile di ambiente ASPNETCORE_HTTP_PORTS per semplificare la modifica delle porte. La variabile accetta un elenco di porte, che è più semplice del formato richiesto da ASPNETCORE_URLS. Se si torna alla porta 80 usando una di queste variabili, l'esecuzione come non-root non è possibile.

Per altre informazioni, vedere Default ASP.NET Core port changed from 80 to 8080 and New non-root 'app' user in Linux images (Nuovo utente 'app' non radice nelle immagini Linux).

Debian 12

Le immagini del contenitore ora usano Debian 12 (Bookworm). Debian è la distribuzione Linux predefinita nelle immagini del contenitore .NET.

Per altre informazioni, vedere Immagini del contenitore Debian aggiornate a Debian 12.

Immagini Ubuntu create con Chisel

Le immagini Ubuntu create con Chisel sono disponibili per .NET 8. Le immagini create con Chisel hanno una superficie di attacco ridotta perché sono molto piccole, non includono uno strumento di gestione pacchetti o una shell e sono non-root. Questo tipo di immagine è destinato agli sviluppatori che vogliono sfruttare i vantaggi dello sviluppo in stile appliance.

Le immagini conselele non supportano la globalizzazione, per impostazione predefinita. extra vengono fornite immagini, che includono icu e tzdata pacchetti.

Per altre informazioni sulla globalizzazione e sui contenitori, vedere Globalizzazione Test App.

Compilare immagini di contenitori multipiattaforma

Docker supporta l'uso e la compilazione di immagini multipiattaforma che funzionano in più ambienti. .NET 8 introduce un nuovo modello che consente di combinare e associare le architetture alle immagini .NET create. Ad esempio, se si usa macOS e si vuole creare un'immagine destinata a un servizio cloud x64 in Azure, è possibile compilarla con l'opzione --platform come segue:

docker build --pull -t app --platform linux/amd64

.NET SDK supporta ora i valori $TARGETARCH e l'argomento -a in fase di ripristino. Il frammento di codice seguente mostra un esempio:

RUN dotnet restore -a $TARGETARCH

# Copy everything else and build app.
COPY aspnetapp/. .
RUN dotnet publish -a $TARGETARCH --self-contained false --no-restore -o /app

Per altre informazioni, vedere il post di blog Improving multi-platform container support.

Immagini composite ASP.NET

Nell'ambito dell'impegno per migliorare le prestazioni di containerizzazione, sono disponibili nuove immagini Docker ASP.NET con una versione composita del runtime. Questa versione composita viene creata compilando più assembly MSIL in un singolo file binario di output R2R (Ready-to-Run). Poiché questi assembly sono incorporati in una singola immagine, la compilazione JIT richiede meno tempo e le prestazioni di avvio delle app migliorano. L'altro grande vantaggio della versione composita rispetto all'immagine ASP.NET regolare è che le immagini composite hanno dimensioni inferiori su disco.

Occorre fare una puntualizzazione. Poiché le versioni composite includono più assembly incorporati in uno, hanno un accoppiamento della versione più stretto. Le app non possono usare versioni personalizzate del framework o file binari ASP.NET.

Le immagini composite sono disponibili per le piattaforme Alpine Linux, Ubuntu ("jammy") e Mariner Distroless dal mcr.microsoft.com/dotnet/aspnet repository. I tag vengono elencati con il suffisso -composite nella pagina ASP.NET Docker.

Pubblicazione dei contenitori

Impostazioni predefinite per l'immagine generata

dotnet publish può produrre immagini del contenitore. Per impostazione predefinita, la produzione non-root di immagini consente alle app di rimanere sicure per impostazione predefinita. Modificare questo valore predefinito in qualsiasi momento impostando la ContainerUser proprietà appropriata, ad esempio con root.

Il tag contenitore di output predefinito è ora latest. Questa impostazione predefinita è in linea con altri strumenti nello spazio dei contenitori e semplifica l'uso dei contenitori nei cicli di sviluppo interni.

Prestazioni e compatibilità

.NET 8 offre prestazioni migliori per il push dei contenitori nei registri remoti, in particolare nei registri di Azure. La maggiore velocità deriva dal push dei livelli in un'unica operazione e, per i registri che non supportano caricamenti atomici, un meccanismo di suddivisione in blocchi più affidabile.

Questi miglioramenti indicano anche che sono supportati più registri: Harbor, Artifactory, Quay.io e Podman.

Autenticazione

.NET 8 aggiunge il supporto per l'autenticazione con scambio di token OAuth (identità gestita di Azure) durante il push dei contenitori nei registri. Questo supporto significa che è ora possibile eseguire il push nei registri come Registro Azure Container senza errori di autenticazione. I comandi seguenti mostrano un flusso di pubblicazione di esempio:

> az acr login -n <your registry name>
> dotnet publish -r linux-x64 -p PublishProfile=DefaultContainer

Per altre informazioni sulla containerizzazione di app .NET, vedere Containerizzare un'app .NET con dotnet publish.

Pubblicazione nell'archivio tar.gz

A partire da .NET 8, è possibile creare un contenitore direttamente come archivio tar.gz. Questa funzionalità è utile se il flusso di lavoro non è semplice e richiede, ad esempio, di eseguire uno strumento di analisi sulle immagini prima di eseguirne il push. Dopo aver creato l'archivio, è possibile spostarlo, analizzarlo o caricarlo in una toolchain Docker locale.

Per eseguire la pubblicazione in un archivio, aggiungere la proprietà ContainerArchiveOutputPath al comando dotnet publish, ad esempio:

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

È possibile specificare un nome di cartella o un percorso con un nome di file specifico.

Vedi anche