Novidades nos contêineres para .NET 8

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

Imagens de contêiner

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

Usuário não raiz

As imagens incluem um usuário non-root. Esse usuário torna as imagens non-root compatíveis. Para executar como non-root, adicione a seguinte linha no final do Dockerfile (ou uma instrução semelhante nos manifestos do Kubernetes):

USER app

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

A porta padrão também foi alterada da porta 80 para 8080. Para dar suporte a essa alteração, uma nova variável de ambiente ASPNETCORE_HTTP_PORTS está disponível para facilitar a alteração das portas. A variável aceita uma lista de portas, que é mais simples do que o formato exigido por ASPNETCORE_URLS. Se você retornar a porta para a porta 80 usando uma dessas variáveis, não poderá executá-la 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 “aplicativo” não raiz em imagens do Linux.

Debian 12

As imagens de contêiner agora usam o Debian 12 (Bookworm). O Debian é a distribuição padrão do Linux nas imagens de contêiner do .NET.

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

Imagens cinzelada do Ubuntu

As imagens cinzeladas do Ubuntu estão disponíveis no .NET 8. As imagens cinzeladas têm uma superfície de ataque reduzida porque são ultra pequenas, não têm nenhum gerenciador de pacotes ou shell e são non-root. Esse tipo de imagem é para desenvolvedores que desejam os benefícios da computação estilo dispositivo.

Por padrão, as imagens cinzeladas não dão suporte à globalização. Imagens extra são fornecidas, que incluem os pacotes icu e tzdata.

Para obter mais informações sobre globalização e contêineres, consulte Aplicativo Teste de Globalização.

Criar imagens de contêiner de várias plataformas

O Docker dá suporte ao uso e à criação de imagens multiplataforma que funcionam em vários ambientes. O .NET 8 apresenta um novo padrão que permite misturar e combinar arquiteturas com as imagens do .NET que você cria. Por exemplo, se você estiver usando 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 dá suporte a valores $TARGETARCH e ao argumento -a na restauração. O seguinte snippet de código 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 postagem no blog Aprimorando o suporte a contêineres de várias plataformas .

Imagens compostas ASP.NET

Como parte de um esforço para melhorar o desempenho da conteinerização, novas imagens do ASP.NET Docker estão disponíveis com uma versão composta do tempo de execução. Essa composição é criada compilando vários assemblies MSIL em um único binário de saída R2R (pronto para execução). Como esses assemblies são inseridos em uma única imagem, o jitting leva menos tempo e o desempenho de inicialização dos aplicativos melhora. A outra grande vantagem da composição sobre a imagem de ASP.NET regular é que as imagens compostas têm um tamanho menor no disco.

Há uma ressalva a ser considerada. Como as composições têm vários assemblies inseridos em um, eles têm um acoplamento de versão mais apertado. Os aplicativos não podem usar versões personalizadas de binários de estrutura ou ASP.NET.

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

Publicação de contêiner

Padrões de imagem gerada

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

A marca de contêiner de saída padrão agora é latest. Esse padrão está em linha com outras ferramentas no espaço de contêineres e facilita o uso de contêineres em loops de desenvolvimento interno.

Desempenho e compatibilidade

O .NET 8 melhorou o desempenho para enviar contêineres por push para registros remotos, especialmente registros do Azure. A aceleração vem de camadas de push em uma operação e, para registros que não dão suporte a uploads atômicos, um mecanismo de agrupamento mais confiável.

Essas melhorias também significam que há suporte para mais registros: Harbor, Artifactory, Quay.io e Podman.

Autenticação

O .NET 8 adiciona suporte à autenticação de troca de token OAuth (Identidade Gerenciada do Azure) ao enviar contêineres por push 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 o contêiner de aplicativos .NET, consulte Containerize um aplicativo .NET com a 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 será útil se o fluxo de trabalho não for simples e exigir que você, por exemplo, execute uma ferramenta de verificação em suas imagens antes de efetuar push delas. Depois que o arquivo é criado, você pode movê-lo, examiná-lo ou carregá-lo em uma cadeia de ferramentas local do Docker.

Para publicar em um arquivo morto, adicione a propriedade ContainerArchiveOutputPath ao seu 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.

Confira também