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 contentor

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

Usuário não-root

As imagens incluem um non-root usuário. Este usuário 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 do non-root usuário, que é 64198. Essa variável de ambiente é útil para o teste Kubernetes runAsNonRoot , 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 ASPNETCORE_HTTP_PORTS de ambiente 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 pelo ASPNETCORE_URLS. Se você alterar a porta de volta para a porta 80 usando uma dessas variáveis, não poderá ser executado 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 de contêiner 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

Chiseled Ubuntu imagens 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. Esse tipo de imagem é para desenvolvedores que querem o benefício da computação no estilo de aparelho.

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

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

Crie imagens de contêiner multiplataforma

O Docker suporta o uso e a criação de 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 estiver a utilizar o macOS e pretender direcionar um serviço de nuvem x64 no Azure, pode criar a imagem utilizando o comutador --platform da seguinte forma:

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

O SDK do .NET agora oferece suporte a $TARGETARCH valores e ao -a argumento 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 postagem do blog Melhorando o suporte a contêineres multiplataforma.

ASP.NET imagens compostas

Como parte de um esforço para melhorar o desempenho da conteinerização, estão disponíveis novas imagens ASP.NET Docker com uma versão composta do tempo de execução. Este composto é construído compilando vários assemblies MSIL 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 mcr.microsoft.com/dotnet/aspnet partir do repo. 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 non-root imagens, o que ajuda seus aplicativos a permanecerem seguros por padrão. Altere esse padrão a qualquer momento definindo o ContainerUser propery, por exemplo, com root.

A tag de contêiner de saída padrão agora 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. O Speedup vem do envio de camadas em uma operação e, para registros que não suportam uploads atômicos, um mecanismo de fragmentação mais confiá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 a .NET app with dotnet publish.

Publicar em tar.gz arquivo

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 de digitalização sobre suas imagens antes de enviá-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 ContainerArchiveOutputPath propriedade 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