.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> <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> <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:
NET - Unit of Work - Padrão Unidade de ...