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 del contenitore .NET per .NET 8:
- utente non root
- Debian 12
- immagini Ubuntu scolpite
- Creare immagini di contenitori multipiattaforma
- ASP.NET immagini composte
Utente non radice
Le immagini includono un utente non-root
. Questo utente rende le immagini non-root
abilitate. Per eseguire in qualità di 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 1654. Questa variabile di ambiente è utile per il test di Kubernetes runAsNonRoot
, che richiede che l'utente del contenitore venga impostato tramite UID e non per nome. Questo dockerfile mostra un esempio di utilizzo.
La porta predefinita è stata modificata da 80
a 8080
. Per supportare questa modifica, è disponibile una 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, non puoi operare come non-root
.
Per ulteriori informazioni, vedere Porta predefinita di ASP.NET Core modificata da 80 a 8080 e Nuovo utente 'app' non root nelle immagini Linux.
Debian 12
Le immagini del container 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 scolpite
Le immagini Ubuntu scolpite sono disponibili per .NET 8. Le immagini scolpite hanno una superficie d'attacco ridotta perché sono ultra-piccole, non hanno un gestore di pacchetti o shell e sono non-root
. Questo tipo di immagine è destinato agli sviluppatori che vogliono sfruttare i vantaggi del calcolo in stile appliance.
Le immagini cesellate non supportano la globalizzazione, di default. Vengono fornite le immagini extra
, che includono i pacchetti icu
e tzdata
.
Per altre informazioni sulla globalizzazione e sui contenitori, vedere Globalization Test App.
Creare immagini di contenitori multipiattaforma
Docker supporta l'uso e la creazione di immagini multipiattaforma che funzionano in più ambienti. .NET 8 introduce un nuovo modello che consente di mescolare e abbinare le architetture con le immagini .NET che costruisci. Ad esempio, se si usa macOS e si vuole usare un servizio cloud x64 in Azure, è possibile compilare l'immagine usando l'opzione --platform
come indicato di seguito:
docker build --pull -t app --platform linux/amd64
.NET SDK supporta ora i valori $TARGETARCH
e l'argomento -a
nel 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 Miglioramento del supporto dei contenitori multipiattaforma.
ASP.NET immagini composite
Nell'ambito di uno sforzo per migliorare le prestazioni di containerizzazione, sono disponibili nuove immagini Docker ASP.NET con una versione composita del runtime. Questo composito viene compilato compilando più assembly CIL in un singolo file binario di output pronto per l'esecuzione (R2R). Poiché questi assembly sono incorporati in una singola immagine, l'jitting richiede meno tempo e le prestazioni di avvio delle app migliorano. L'altro grande vantaggio del composito rispetto all'immagine ASP.NET regolare è che le immagini composite hanno dimensioni inferiori su disco.
C'è un'avvertenza da tenere presente. Poiché i compositi hanno più assiemi incorporati in uno, hanno un accoppiamento di versione più stretto. Le app non possono usare versioni personalizzate del framework o ASP.NET file binari.
Le immagini composite sono disponibili dal repository mcr.microsoft.com/dotnet/aspnet
per le piattaforme Alpine Linux, Ubuntu ("jammy") e Mariner Distroless. I tag vengono elencati con il suffisso -composite
nella pagina ASP.NET Docker.
Pubblicazione di contenitori
- Immagine generata predefinita
- Prestazioni e compatibilità
- Autenticazione
- Pubblica in un archivio tar.gz
Impostazioni predefinite per l'immagine generata
dotnet publish
può produrre immagini del contenitore. La configurazione predefinita prevede la produzione di immagini non-root
, il che aiuta le app a rimanere sicure di default. Modificare questo valore predefinito in qualsiasi momento impostando la proprietà ContainerUser
, 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 i registri di Azure. La velocizzazione deriva dal push dei livelli in un'unica operazione e, per i registri che non supportano caricamenti atomici, un meccanismo di suddivisione in blocchi efficiente.
Questi miglioramenti indicano anche che sono supportati più registri: Harbor, Artifactory, Quay.io e Podman.
Autenticazione
.NET 8 aggiunge il supporto per l'autenticazione tramite scambio di token OAuth (Identità gestita di Azure) quando si pubblicano i contenitori ai 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 creazione di contenitori di app .NET, vedere Containerizzare un'app .NET con dotnet publish.
Pubblica 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 pubblicare 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.