Depurar aplicativos em um contêiner local do Docker
O Visual Studio fornece uma maneira consistente de desenvolver contêineres do Docker e validar seu aplicativo localmente. Você pode executar e depurar seus aplicativos em contêineres Linux ou Windows em execução na área de trabalho local do Windows com o Docker instalado e não precisa reiniciar o contêiner sempre que fizer uma alteração de código.
Este artigo ilustra como usar o Visual Studio para iniciar um aplicativo em um contêiner Docker local, fazer alterações e, em seguida, atualizar o navegador para ver as alterações. Este artigo também mostra como definir pontos de interrupção para depuração de aplicativos em contêineres. Os tipos de projeto suportados incluem aplicativo Web, aplicativo de console e função do Azure direcionada ao .NET Framework e .NET Core. Os exemplos apresentados neste artigo são um projeto do tipo ASP.NET Core Web App e um projeto do tipo Console App (.NET Framework).
Se você já tiver um projeto de um tipo suportado, o Visual Studio pode criar um Dockerfile e configurar seu projeto para ser executado em um contêiner. Consulte Ferramentas de contêiner no Visual Studio.
Pré-requisitos
Para depurar aplicativos em um contêiner Docker local, as seguintes ferramentas devem ser instaladas:
- Visual Studio 2019 com a carga de trabalho de Desenvolvimento Web instalada
- Visual Studio 2022 com a carga de trabalho de Desenvolvimento Web instalada
Para executar contêineres do Docker localmente, você deve ter um cliente Docker local. Você pode usar Docker Desktop, que requer o Windows 10 ou posterior.
Criar um aplicativo Web
Se tiver um projeto e tiver adicionado suporte ao Docker conforme descrito na visão geral de , ignore esta seção.
Na janela Iniciar do Visual Studio, selecione Criar um novo projeto.
Selecione ASP.NET Core Web Appe, em seguida, selecione Avançar.
Introduza um nome para a nova aplicação (ou utilize o nome predefinido), especifique a localização no disco e, em seguida, selecione Seguinte.
Selecione a versão .NET que você deseja segmentar. Se não tiver certeza, escolher a versão LTS (suporte de longo prazo).
Escolha se pretende suporte a SSL selecionando ou desmarcando a caixa de seleção Configurar para HTTPS.
Marque a caixa de seleção Ativar Suporte do Docker.
Use a lista suspensa para selecionar o tipo de contêiner desejado: Windows ou Linux.
Selecione Criar para concluir o processo.
Na janela Iniciar do Visual Studio, selecione Criar um novo projeto.
Selecione ASP.NET Core Web Appe, em seguida, selecione Avançar.
Introduza um nome para a nova aplicação (ou utilize o nome predefinido), especifique a localização no disco e, em seguida, selecione Seguinte.
Selecione a versão .NET que você deseja segmentar. Se não tiver certeza, escolha a versão LTS (suporte de longo prazo) ,.
Escolha se deseja suporte a SSL ao marcar ou desmarcar a caixa de seleção Configurar para HTTPS.
Selecione a caixa de seleção Ativar Docker.
Use a lista suspensa Docker OS para selecionar o tipo de contêiner desejado: Windows ou Linux.
Selecione Criar para concluir o processo.
Edite suas páginas do Razor e atualize
Para iterar rapidamente as alterações em suas páginas do Razor, você pode iniciar seu aplicativo em um contêiner. Em seguida, continue a fazer alterações, visualizando-as como faria com o IIS (Serviços de Informações da Internet) Express.
Verifique se o Docker está configurado para usar o tipo de contêiner (Linux ou Windows) que você está usando. Clique com o botão direito do mouse no ícone do Docker na barra de tarefas e escolha Alternar para contêineres Linux ou Alternar para contêineres do Windows conforme apropriado.
Editar seu código e atualizar o site em execução conforme descrito nesta seção não está habilitado nos modelos padrão no .NET Core e .NET 5 e posterior. Para habilitá-lo, adicione o pacote NuGet Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation. Adicione uma chamada ao método de extensão AddRazorRuntimeCompilation ao código no método
Startup.ConfigureServices
. Você só precisa disso ativado no modo DEBUG, portanto, codifique-o da seguinte forma no métodoMain
:// Add services to the container. var mvcBuilder = builder.Services.AddRazorPages(); #if DEBUG if (Env.IsDevelopment()) { mvcBuilder.AddRazorRuntimeCompilation(); } #endif
Para obter mais informações, consulte compilação do arquivo Razor no ASP.NET Core. O código exato pode variar, dependendo da estrutura de destino e do modelo de projeto usado.
Defina a configuração da solução para depuração . Em seguida, pressione Ctrl+F5 para criar sua imagem do Docker e executá-la localmente.
Quando a imagem de contêiner é criada e executada em um contêiner do Docker, o Visual Studio inicia o aplicativo Web em seu navegador padrão.
Vá para a página Índice. Faremos alterações nesta página.
Retorne ao Visual Studio e abra Index.cshtml.
Adicione o seguinte conteúdo HTML ao final do ficheiro e, em seguida, guarde as alterações.
<h1>Hello from a Docker container!</h1>
Na janela de saída, quando a compilação do .NET estiver concluída e você vir as seguintes linhas, volte para o navegador e atualize a página:
Now listening on: http://*:80 Application started. Press Ctrl+C to shut down.
As suas alterações foram aplicadas!
Depurar com pontos de interrupção
Muitas vezes, as alterações exigem uma inspeção mais aprofundada. Você pode usar os recursos de depuração do Visual Studio para essa tarefa.
No Visual Studio, abra Index.cshtml.cs.
Substitua o conteúdo do método
OnGet
com o seguinte código:ViewData["Message"] = "Your application description page from within a container";
À esquerda da linha de código, defina um ponto de interrupção.
Para iniciar a depuração e atingir o ponto de interrupção, pressione F5.
Alterne para o Visual Studio para exibir o ponto de interrupção. Inspecione valores.
Recarregamento instantâneo
Além disso, no Visual Studio 17.10 e posterior, Hot Reload é suportado em contentores, embora seja importante notar que, num contentor, é necessário atualizar a página para ver as alterações. Se a alteração for para um arquivo CSS, você novamente terá que atualizar a página para ver essas alterações. Observe também que as atualizações de arquivos CSS com escopo (arquivos.razor.css
, consulte isolamento CSS do ASP.NET Core Blazor) não são suportadas como parte do recarregamento a quente.
Criar um aplicativo de console do .NET Framework
Esta seção apresenta como depurar um projeto de aplicativo de console do .NET Framework em um contêiner Docker local mostrando primeiro como adicionar suporte ao Docker ao projeto. É importante reconhecer que diferentes tipos de projeto têm diferentes níveis de suporte ao Docker. Há até mesmo diferentes níveis de suporte ao Docker para projetos de aplicativo de console do .NET Core (incluindo .NET 5 e posterior) versus projetos de aplicativo de console do .NET Framework.
Quando um projeto de aplicativo de console do .NET Framework é criado, não há opção para habilitar o suporte ao Docker. Depois de criar esse projeto, não há como adicionar explicitamente o suporte ao Docker ao projeto. Para um projeto de aplicativo de console do .NET Framework, é possível adicionar suporte para orquestração de contêineres. Um efeito colateral da adição de suporte de orquestração ao projeto de aplicativo de console do .NET Framework é que ele adiciona suporte ao Docker ao projeto.
O procedimento a seguir demonstra como adicionar suporte a orquestração a um projeto de aplicativo de console do .NET Framework, que posteriormente adiciona suporte ao Docker e permite que o projeto possa ser depurado num contêiner Docker local.
- Crie um novo projeto de aplicativo de console do .NET Framework.
- No Explorador de Soluções, clique com o botão direito do rato no nó do projeto e, de seguida, selecione Adicionar>Suporte à Orquestração de Contentores. Na caixa de diálogo exibida, selecione Docker Compose. Um Dockerfile é adicionado ao seu projeto e um projeto Docker Compose com arquivos de suporte associados é adicionado.
Depurar com pontos de interrupção
No Gerenciador de Soluções, abra Program.cs.
Substitua o conteúdo do método
Main
com o seguinte código:System.Console.WriteLine("Hello, world!");
Defina um ponto de interrupção à esquerda da linha de código.
Pressione F5 para iniciar a depuração e atingir o ponto de interrupção.
Alterne para o Visual Studio para exibir o ponto de interrupção e inspecionar valores.
Autenticando nos serviços do Azure usando o proxy de token
Quando estiver a utilizar os serviços do Azure a partir de um contentor, pode utilizar DefaultAzureCredential (com o VisualStudioCredential ativado) para autenticar com os serviços do Azure com a sua conta Microsoft Entra sem qualquer configuração adicional no contentor. Para habilitar isso, consulte Como configurar o Visual Studio Container Tools. Além disso, você precisa configurar a autenticação do Azure no Visual Studio seguindo as instruções em Authenticate Visual Studio with Azure. O suporte para VisualStudioCredential em um contêiner está disponível no Visual Studio versão 17.6 e posterior.
Azure Functions
Se estiveres a depurar um projeto integrado do Azure Functions e a usar o proxy de token no contentor para gerir a autenticação para os serviços do Azure, precisas de copiar o runtime do .NET para o contentor para que o proxy de token seja executado. Se você estiver depurando um projeto isolado do Azure Functions, ele já tem o tempo de execução do .NET, portanto, não há necessidade dessa etapa extra.
Para garantir que o tempo de execução do .NET esteja disponível para o proxy de token, adicione ou modifique a camada de debug
no Dockerfile que copia o tempo de execução do .NET na imagem do contêiner. Para contêineres Linux, você pode adicionar o seguinte código ao Dockerfile:
# This layer is to support debugging, VS's Token Proxy requires the runtime to be installed in the container
FROM mcr.microsoft.com/dotnet/runtime:8.0 AS runtime
FROM base as debug
COPY --from=runtime /usr/share/dotnet /usr/share/dotnet
RUN ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet
Além disso, no projeto do Visual Studio, você precisa fazer algumas alterações para especificar isso como a camada a ser usada ao depurar no Modo Rápido. Para obter uma explicação do Modo Rápido, consulte Personalizar contêineres do Docker no Visual Studio. Para cenários de contêiner único (não Docker Compose), defina a propriedade MSBuild DockerfileFastModeStage
como debug
para usar essa camada para depuração. Para Docker Compose, modifique o docker-compose.vs.debug.yml
da seguinte maneira:
# Set the stage to debug to use an image with the .NET runtime in it
services:
functionappintegrated:
build:
target: debug
Para obter um exemplo de código de autenticação com o Azure Functions, incluindo cenários integrados e isolados, consulte VisualStudioCredentialExample.
Reutilização de contentores
Quando você usa modo rápido, que o Visual Studio normalmente usa para a configuração de depuração, o Visual Studio recria apenas suas imagens de contêiner e o próprio contêiner quando você altera o Dockerfile. Se você não alterar o Dockerfile, o Visual Studio reutilizará o contêiner de uma execução anterior.
Se você modificou manualmente seu contêiner e deseja reiniciar com uma imagem de contêiner limpa, use o comando Build>Clean no Visual Studio e compile normalmente.
Quando você não estiver usando o Modo Rápido, que é típico para a configuração de versão, o Visual Studio recria o contêiner cada vez que o projeto é criado.
Você pode configurar quando o Modo Rápido é usado; consulte Como configurar o Visual Studio Container Tools.
Solução de problemas
Saiba como solucionar problemas de desenvolvimento do Visual Studio Docker.
Conteúdo relacionado
Obtenha mais detalhes lendo Como o Visual Studio cria aplicativos em contêiner.
Mais sobre o Docker com Visual Studio, Windows e Azure
- Saiba mais sobre desenvolvimento de contêiner com o Visual Studio.
- Para criar e implementar um contenedor Docker, consulte integração do Docker para o Azure Pipelines.
- Para obter um índice de artigos do Windows Server e do Nano Server, consulte as informações de contentor do Windows .
- Saiba mais sobre do Serviço Kubernetes do Azure e consulte a documentação do Serviço Kubernetes do .