.NET 7 -  Criando imagens sem o Dockerfile (NET CLI)


  Hoje vou apresentar um novo recurso do .NET 7.0 :  A geração de imagem sem precisar do arquivo Dockerfile.

Não há como negar que os contêineres se tornaram uma das maneiras mais fáceis de distribuir e executar um amplo conjunto de aplicativos e serviços na nuvem.

A plataforma .NET já inclui o suporte aos containeres com geração automática dos arquivos Dockerfile e .dockerignore e também permite fazer a orquestração dos containeres.

A versão 7.0 da plataforma .NET trouxe mais um recurso para facilitar a utilização dos contâineres e agora oferece suporte à criação de imagens Docker sem usar o Dockerfile – apenas usando o .NET CLI.

Para mostrar isso na prática vamos criar uma aplicação Web API no ambiente do .NET 7.0 usando o VS 2022 Community.

Criando a API com suporte ao Docker

Vamos criar um novo projeto usando o template Web API chamado DemoApi:

Vamos definir as seguinets configurações para criar a API :

Clicando no botão Create teremos o projeto criado contendo o arquivo Dockerfile e .dockerignore no projeto:



Neste momento podemos criar uma imagem baseada neste Dockerfile abriando o arquivo de projeto no Terminal e movendo para a pasta da solução:

A seguir podemos emitir o comando para gerar a imagem indicando o caminho do arquivo Dockerfile :

docker build -t demoapi:0.1 -f DemoApi/Dockerfile .

Ao final teremos a imagem demoapi:0.1 gerada e podemos criar um contâiner para executar a aplicação usando o seguinte comando:

docker run -p 5000:80 demoapi:01

E poderemos acessar a aplicação no navegador em : localhost:5000/weatherforecast

Esse seria o roteiro padrão antes do .NET 7. Vejamos agora o que mudou...

Gerando a imagem sem o Dockerfile

Vamos iniciar removendo do projeto os arquivos Dockerfile e .dockerignore.

Com isso nosso projeto agora possui a seguinte estrutura.

Vamos gerar a imagem e a seguir o contâiner sem precisar do arquivo Dockerfile.

Para isso temos que incluir no projeto o pacote  Microsoft.Net.Build.Containers :

Pronto !

Com isso podemos gerar uma imagem para o nossa aplicação em duas etapas:

1- Revemor a tag <DockerDefaultTargetOS> do PropertyGroup do arquivo de projeto:

<PropertyGroup>
   <
TargetFramework>net7.0</TargetFramework>
   <
Nullable>enable</Nullable>
   <
ImplicitUsings>enable</ImplicitUsings>
</
PropertyGroup>

2- Abrindo uma janela do Terminal na pasta do projeto e emitindo o seguinte comando:

dotnet publish --os linux --arch x64 -p:PublishProfile=DefaultContainer

Note que foi gerada uma imagem chamada demoapi:1.0.0 e agora podemos criar o contâiner com base nesta imagem usando o comando:

docker run -p 5000:80 demoapi:1.0.0

Acessando localhost:5000/weatherforecast podemos ver a API em atendimento no container:

E com isso geramos a imagem e criamos o contâiner para essa imagem sem precisar do arquivo Dockerfile usando apenas o comando dotnet publish.

Para aplicações  ASP.NET Core, a imagem base usada é mcr.microsoft.com/dotnet/aspnet com a tag da versão plataforma .NET usada.  Estas são as imagens usadas automaticamente:

- Aplicativos ASP.NET Core: mcr.microsoft.com/dotnet/aspnet
- Aplicativos independentes: mcr.microsoft.com/dotnet/runtime-deps
- Outros aplicativos .NET: mcr.microsoft.com/dotnet/runtime

Podemos incuir a tag <PublishProfile> no arquivo de projeto de projeto :

<PropertyGroup>

   <TargetFramework>net7.0</TargetFramework>
    <
Nullable>enable</Nullable>
    <
ImplicitUsings>enable</ImplicitUsings>
    <PublishProfile>DefaultContainer</PublishProfile>
   </PropertyGroup>

<ItemGroup>
...

E agora podemos simplificar a o comando dotnet:

dotnet publish --os linux --arch x64

Alémdisso podemos definir no arquivo de projeto valores padrão para usar:

<PropertyGroup>

   <TargetFramework>net7.0</TargetFramework>
    <
Nullable>enable</Nullable>
    <
ImplicitUsings>enable</ImplicitUsings>
    <PublishProfile>DefaultContainer</PublishProfile>
    <
ContainerBaseImage>mcr.microsoft.com/dotnet/aspnet:7.0</ContainerBaseImage>
    <
ContainerRegistry>registry.macoratti.com:1234</ContainerRegistry>
    <
ContainerImageTag>1.2.3-alpha1;latest</ContainerImageTag
>
   </
PropertyGroup>

<ItemGroup>
...

Podemos ainda definir a configuração das portas e das variáveis de ambiente :

<ItemGroup>
   <
ContainerPort Include="80" Type="tcp"/>
   <
ContainerEnvironmentVariable Include="" Value=""/>
 </
ItemGroup>

Desta forma agora o .NET CLI é o comando que pode ser usado para criar, construir, testar e publicar aplicativos .NET, e, ter recursos para criar contêineres integrados a essa CLI reduz a complexidade e facilita o uso para desenvolvedores .NET.

E estamos conversados...

"Porque todos pecaram e destituídos estão da glória de Deus;
Sendo justificados gratuitamente pela sua graça, pela redenção que há em Cristo Jesus."
Romanos 3:23,24

Referências:


José Carlos Macoratti