ASP.NET Core 2 - Docker - Falha na extração após "pull" request - ProcessUtilityVMImage - UtilityVM

Durante o processo de "containerização" me deparei com uma falha que já é motivo de diverssas issues no github do Docker.
Para quem está no caminho do aprendizado, se deparar com uma situação assim não é nada agradável, visto que em diferentes momentos cada usuário dá uma opinião diferente sobre a possível solução, que vai desde problemas com o antivírus até falhas invisíveis do firewall, entre outras.

failed to register layer: re-exec error: exit status 1: output: ProcessUtilityVMImage C:\ProgramData\docker\windowsfilter.... UtilityVM: The system cannot find the path specified.

Diante desse cenário, depois de ver tentar entender as inúmeras versões (tags) das imagens do Docker uma situação ficou mais clara:

  • Windows Server 2016 1607
  • Windows Server 2016 1790
  • Windows Server Core 2016 1790
  • Windows Server 2016 1803
  • Windows Server Core 2016 1803

Todas são versões do Windows Server 2016, todas permitem a "containerização" possuem suporte ao Docker, esse suporte já é nativo, ou seja, sem a necessidade de instalação do pacote do Docker.

Windows Server 2016 1607

O número 1607 referencia a build da geração do sistema operacional, esta versão especificamente também é chamada de insider é a primeira versão do Windows Server 2016 e por mais que essa versão possua suporte ao Docker não há imagens para geração de container para essa versão, por isso a falha acima acontece.

Imagens para ASP.NET Core 2.1

Nenhuma das imagens do Docker para ASP.NET Core 2.1 possuem suporte para o Windows Server 2016 1607 (Insider), vamos então considerar a seguinte hipótese:

  • Windows Server 2016 1607 instalado;
  • Docker build gerada com a imagem base.

Não vai funcionar, ou seja, você vai se deparar com a mensagem de falha que está sendo tratada neste post.

As imagens do Docker para o ASP.NET Core 2.1 já possuem suporte conforme os itens:

  • 2.1-sdk
  • 2.1-aspnetcore-runtime
  • 2.1-runtime

Solução - Windows Server 2016

Para solucionar o problema em definitivo siga o passo:

  • Instale o Windows Server 2016 (build 1709 ou superior), ambas já possuem suporte aos containers. Você vai também encontrar com os nomes "Microsoft Windows Server 1709 with Containers - ami-cb271cae" ou "Microsoft Windows Server 1709 Semi-Annual Channel release with Containers [English]"

Solução - Dockerfile

Após a instalação do Windows Server 2016 (build 1709 ou superior) realize a configuração do Dockerfile conforme exemplo a seguir.

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base  
WORKDIR /app

FROM microsoft/dotnet:2.1-sdk AS build  
WORKDIR /src  
COPY *.csproj <projectname>/  
RUN dotnet restore <projectname>/<project>.csproj

WORKDIR /src/<projectname>  
COPY . ./  
RUN dotnet build <project>.csproj -c Release -o /app

FROM build AS publish  
RUN dotnet publish <project>.csproj -c Release -o /app

ENV ASPNETCORE_ENVIRONMENT Development

FROM base AS final  
WORKDIR /app  
COPY --from=publish /app .  
ENTRYPOINT ["dotnet", "<projectname>.dll"]  

Nesta sugestão as imagens base do ASP.NET Core 2.1 estão configuradas para utilizar o Windows Server 2016 (build 1709). Na documentação do Docker você encontra outras opções.

Dica

Procure não utilizar as imagens que são o sistema operacional completo do Windows Server 2016, pois sua aplicação vai ficar com mais de 4Gb.
Neste caso do exemplo acima, dependendo do tamanho da sua aplicação, vai ficar com 200Mb e aí você pode usar o docker hub para subir as suas imagens e baixar no servidor.