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
- Debian 12
- Imagens do Ubuntu esculpidas
- Crie imagens de contêiner multiplataforma
- ASP.NET imagens compostas
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.