Compartilhar via


Novidades em contêineres para .NET 8

Este artigo descreve 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:

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 a UID para o usuário non-root, que é 1654. Essa variável de ambiente é útil para o teste de 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 de 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ê alterar a porta de volta para a porta 80 usando uma dessas variáveis, não poderá 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 “aplicativo” não raiz em imagens do Linux.

Debian 12

As imagens de contêiner agora usam o Debian 12 (Bookworm). 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 cinzeladas 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.

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

Para obter mais informações sobre globalização e contêineres, consulte Aplicativo de 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 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 dá suporte a valores $TARGETARCH e ao argumento -a na restauração. O snippet 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 postagem no blog Aprimoramento do suporte a contêiner de várias plataformas.

ASP.NET imagens compostas

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 CIL 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 em relação à imagem de ASP.NET regular é que as imagens compostas têm um tamanho menor no disco.

Há uma ressalva a ser observada. 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 da estrutura ou binários 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 tags são listadas com o sufixo -composite na página ASP.NET Docker .

Publicação de contêiner

Padrões de imagem gerada

dotnet publish pode produzir imagens de contêiner. Ele usa como 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 em qualquer momento definindo a propriedade ContainerUser, por exemplo, com root.

A etiqueta 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, rode uma ferramenta de verificação nas suas imagens antes de subi-las. 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, 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.

Consulte também