Partilhar via


O que há de novo nos contêineres do .NET 8

Este artigo descreve os novos recursos em contêineres para .NET 8.

Imagens de contêiner

As seguintes alterações foram feitas nas imagens de contêiner do .NET para .NET 8:

Utilizador não-root

As imagens incluem um usuário non-root. Este utilizador torna as imagens non-root capazes. Para executar como non-root, adicione a seguinte linha no final do seu Dockerfile (ou uma instrução semelhante em seus manifestos do Kubernetes):

USER app

O .NET 8 adiciona uma variável de ambiente para o UID para o usuário non-root, que é 1654. Essa variável de ambiente é útil para o teste de runAsNonRoot do Kubernetes, que requer que o usuário do contêiner seja definido via UID e não pelo nome. Este dockerfile mostra um exemplo de uso.

A porta padrão também mudou de porta 80 para 8080. Para suportar essa mudança, uma nova variável de ambiente ASPNETCORE_HTTP_PORTS está disponível para facilitar a mudança de portas. A variável aceita uma lista de portas, que é mais simples do que o formato exigido por ASPNETCORE_URLS. Se alterares a porta de volta para a porta 80 usando uma dessas variáveis, não consegues executar como non-root.

Para obter mais informações, consulte Porta padrão do ASP.NET Core alterada de 80 para 8080 e Novo usuário 'app' não-root em imagens do Linux.

Debian 12

As imagens container agora usam Debian 12 (Bookworm). Debian é a distro Linux padrão nas imagens de contêiner .NET.

Para mais informações, veja imagens de contêiner Debian atualizadas para Debian 12.

Imagens do Ubuntu esculpidas

imagens Chiseled Ubuntu estão disponíveis para .NET 8. As imagens esculpidas têm uma superfície atacada reduzida porque são ultrapequenas, não têm gerenciador de pacotes ou shell e são non-root. Este tipo de imagem é para desenvolvedores que querem o benefício da computação em estilo de dispositivo.

As imagens esculpidas não suportam globalização, por padrão. extra imagens são fornecidas, incluindo pacotes icu e tzdata.

Para obter mais informações sobre globalização e contêineres, consulte Globalization Test App.

Crie imagens de contêiner multiplataforma

O Docker oferece suporte ao uso e à criação imagens multiplataforma que funcionam em vários ambientes. O .NET 8 introduz um novo padrão que permite misturar e combinar arquiteturas com as imagens do .NET que você cria. Por exemplo, se você estiver usando o macOS e quiser direcionar um serviço de nuvem x64 no Azure, poderá criar a imagem usando a opção --platform da seguinte maneira:

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

O SDK do .NET agora oferece suporte a valores $TARGETARCH e ao argumento -a na restauração. O trecho de código a seguir mostra um exemplo:

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

Para obter mais informações, consulte a publicação do blogue Melhorando o suporte a contentores multiplataforma.

ASP.NET imagens compostas

Como parte de um esforço para melhorar o desempenho da contentorização, disponibilizaram-se novas imagens ASP.NET Docker com uma versão combinada do runtime. Esse composto é construído compilando vários assemblies CIL em um único binário de saída pronto para execução (R2R). Como esses assemblies são incorporados em uma única imagem, o jitting leva menos tempo e o desempenho de inicialização dos aplicativos melhora. A outra grande vantagem da imagem composta em relação à imagem ASP.NET normal é que as imagens compostas têm um tamanho menor no disco.

Há uma ressalva a ter em conta. Como os compósitos têm vários conjuntos embutidos em um, eles têm acoplamento de versão mais rígido. Os aplicativos não podem usar versões personalizadas da estrutura ou ASP.NET binários.

Imagens compostas estão disponíveis para as plataformas Alpine Linux, Ubuntu ("jammy") Chiseled e Mariner Distroless a partir do repositório mcr.microsoft.com/dotnet/aspnet. As tags são listadas com o sufixo -composite na página ASP.NET Docker.

Publicação em contêiner

Padrões de imagem gerada

dotnet publish pode produzir imagens de contêiner. O padrão é produzir imagens non-root, o que ajuda seus aplicativos a permanecerem seguros por padrão. Altere este padrão a qualquer momento definindo a propriedade ContainerUser, por exemplo, com root.

A tag de contêiner de saída padrão agora está latest. Esse padrão está alinhado com outras ferramentas no espaço de contêineres e torna os contêineres mais fáceis de usar em loops de desenvolvimento internos.

Desempenho e compatibilidade

O .NET 8 melhorou o desempenho para enviar contêineres para registros remotos, especialmente registros do Azure. A aceleração resulta do envio de camadas numa única operação e, para registos que não suportam uploads atómicos, de um mecanismo de divisão em fragmentos mais fiável.

Essas melhorias também significam que mais registros são suportados: Harbor, Artifactory, Quay.io e Podman.

Autenticação

O .NET 8 adiciona suporte para autenticação de troca de token OAuth (Identidade Gerenciada do Azure) ao enviar contêineres para registros. Esse suporte significa que agora você pode enviar por push para registros como o Registro de Contêiner do Azure sem erros de autenticação. Os comandos a seguir mostram um exemplo de fluxo de publicação:

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

Para obter mais informações sobre a criação de contêineres de aplicativos .NET, consulte Containerize um aplicativo .NET com dotnet publish.

Publicar no arquivo tar.gz

A partir do .NET 8, você pode criar um contêiner diretamente como um arquivo tar.gz. Esse recurso é útil se o fluxo de trabalho não for simples e exigir que você, por exemplo, execute uma ferramenta para verificar as suas imagens antes de publicá-las. Depois que o arquivo é criado, você pode movê-lo, digitalizá-lo ou carregá-lo em uma cadeia de ferramentas local do Docker.

Para publicar em um arquivo, adicione a propriedade ContainerArchiveOutputPath ao comando dotnet publish, por exemplo:

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

Você pode especificar um nome de pasta ou um caminho com um nome de arquivo específico.

Ver também