Skip to main content

dotnet publish | .NET 10, CSharp 14 | CSharp

  • dotnet publish | .NET 10, CSharp 14 | CSharp

📦 .NET 10 — Containerização Nativa (Native Container Publishing)

O .NET 10 introduz suporte nativo à publicação de containers, permitindo criar, taguear e publicar imagens diretamente pela CLI do .NET, sem necessidade de:

  • Dockerfile
  • Docker CLI
  • Build manual de imagens

Tudo é feito via MSBuild, de forma repetível e amigável para CI/CD.


🎯 O que mudou?

Antes:

  • Era obrigatório escrever um Dockerfile
  • Dependência direta do Docker
  • Builds mais difíceis de padronizar

Agora:

  • O próprio dotnet publish gera a imagem
  • Build determinístico via MSBuild
  • Push direto para registries

🧠 Como funciona

O .NET usa targets de MSBuild para:

  1. Compilar a aplicação
  2. Criar a imagem de container
  3. Aplicar tags
  4. (Opcional) Publicar no registry

Tudo isso acontece com um único comando.


▶️ Comando mais simples

dotnet publish \
--os linux \
--arch x64 \
/t:PublishContainer

📌 Resultado:

  • A aplicação é compilada
  • Uma imagem de container é criada localmente

🏷️ Publicando com nome e registry

dotnet publish -r linux-x64 \
/p:PublishProfile=DefaultContainer \
/p:ContainerImageName=myapp \
/p:ContainerRegistry=myregistry.azurecr.io

Isso gera e publica automaticamente a imagem em:

myregistry.azurecr.io/myapp:latest

⚙️ Configuração via .csproj

Você pode configurar tudo diretamente no projeto:

<PropertyGroup>
<PublishProfile>DefaultContainer</PublishProfile>
<ContainerImageName>myapp</ContainerImageName>
<ContainerRegistry>myregistry.azurecr.io</ContainerRegistry>
<ContainerImageTag>v1.0.0</ContainerImageTag>
</PropertyGroup>

Depois, basta rodar:

dotnet publish -r linux-x64

🧪 Exemplo completo (API mínima)

Program.cs

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "Hello from .NET 10 container!");

app.Run();

Build e push

dotnet publish \
-r linux-x64 \
/p:ContainerImageName=hello-dotnet10 \
/p:ContainerRegistry=myregistry.azurecr.io

🚀 Uso em CI/CD

Exemplo: GitHub Actions

- name: Publish container
run: |
dotnet publish -r linux-x64 \
/p:PublishProfile=DefaultContainer \
/p:ContainerImageName=myapp \
/p:ContainerRegistry=myregistry.azurecr.io

✔ Sem Docker ✔ Sem Dockerfile ✔ Build reproduzível


✅ Benefícios

  • ❌ Sem Dockerfile

  • ❌ Sem Docker CLI

  • ✅ Build padronizado via MSBuild

  • ✅ Ideal para CI/CD

  • ✅ Push direto para:

    • Docker Hub
    • Azure Container Registry (ACR)
    • Amazon ECR
    • Google Container Registry (GCR)

⚠️ Limitações (importante)

Essa abordagem não substitui o Docker em todos os cenários.

❌ Não é ideal se você precisa de:

  • Multi-stage builds customizados
  • Dependências nativas específicas
  • Controle fino de camadas da imagem
  • Ferramentas extras no container (curl, ffmpeg, etc.)

Nesses casos, Dockerfile tradicional ainda é a melhor opção.


🧭 Quando usar

Use containerização nativa do .NET 10 quando:

  • Microservices simples
  • APIs internas
  • Ferramentas internas
  • Ambientes sem Docker disponível
  • Pipelines CI/CD mais enxutos

🏁 Conclusão

A containerização nativa do .NET 10 não tenta substituir o Docker — ela simplifica o caminho padrão.

Para a maioria dos serviços modernos:

  • menos arquivos
  • menos ferramentas
  • menos complexidade
  • mais velocidade

É uma excelente escolha para times que querem produtividade e consistência.