Personalizar contêineres do Docker no Visual Studio
Você pode personalizar suas imagens de contêiner editando o Dockerfile que o Visual Studio gera quando você adiciona suporte ao Docker ao seu projeto. Se você estiver criando um contêiner personalizado a partir do IDE do Visual Studio ou configurando uma compilação de linha de comando, você precisa saber como o Visual Studio usa o Dockerfile para criar seus projetos. Você precisa saber esses detalhes porque, por motivos de desempenho, o Visual Studio segue um processo especial para criar e executar aplicativos em contêineres que não é óbvio no Dockerfile.
Suponha que você queira fazer uma alteração no Dockerfile e ver os resultados no debug e nos containers de produção. Nesse caso, você pode adicionar comandos no Dockerfile para modificar o primeiro estágio (geralmente base
). Consulte Modificar a imagem do contêiner para depuração e produção. Mas, se tu quiseres fazer uma alteração somente durante a depuração, mas não na produção, deves criar outro estágio e usar a configuração de compilação DockerfileFastModeStage
para indicar ao Visual Studio que utilize esse estágio para compilações de debug. Consulte Modificar a imagem do contêiner somente para depurar.
Este artigo explica o processo de compilação do Visual Studio para aplicativos em contêiner com alguns detalhes e, em seguida, contém informações sobre como modificar o Dockerfile para afetar as compilações de depuração e produção, ou apenas para depuração.
Construções de Dockerfile no Visual Studio
Observação
Esta seção descreve o processo de compilação de contêiner que o Visual Studio usa quando você escolhe o tipo de compilação de contêiner Dockerfile. Se você estiver usando o tipo de compilação do SDK do .NET, as opções de personalização serão diferentes e as informações nesta seção não serão aplicáveis. Em vez disso, consulte Containerize um aplicativo .NET com dotnet publish e use as propriedades descritas em Personalizar o seu contêiner para configurar o processo de construção do contêiner.
Construção em vários estágios
Quando o Visual Studio cria um projeto que não usa contêineres do Docker, ele invoca o MSBuild na máquina local e gera os arquivos de saída em uma pasta (normalmente bin
) na pasta da solução local. Para um projeto em contêiner, no entanto, o processo de compilação leva em conta as instruções do Dockerfile para criar o aplicativo em contêiner. O Dockerfile que o Visual Studio usa é dividido em vários estágios. Esse processo depende do recurso de vários estágios de compilação do Docker.
O recurso de compilação de vários estágios ajuda a tornar o processo de criação de contêineres mais eficiente e torna os contêineres menores, permitindo que eles contenham apenas os bits de que seu aplicativo precisa em tempo de execução. A compilação de vários estágios é usada para projetos .NET Core, não para projetos do .NET Framework.
A construção de vários estágios permite que imagens de contentores sejam criadas em etapas que produzem imagens intermédias. Como exemplo, considere um Dockerfile típico. O primeiro estágio é chamado de base
no Dockerfile que o Visual Studio gera, embora as ferramentas não exijam esse nome.
# This stage is used when running from VS in fast mode (Default for Debug configuration)
FROM mcr.microsoft.com/dotnet/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
As linhas no Dockerfile começam com a imagem ASP.NET do Microsoft Container Registry (mcr.microsoft.com) e criam uma imagem intermediária base
que expõe as portas 80 e 443 e define o diretório de trabalho como /app
.
A próxima etapa é build
, que aparece da seguinte forma:
# This stage is used to build the service project
FROM mcr.microsoft.com/dotnet/sdk:3.1-buster-slim AS build
WORKDIR /src
COPY ["WebApplication43/WebApplication43.csproj", "WebApplication43/"]
RUN dotnet restore "WebApplication43/WebApplication43.csproj"
COPY . .
WORKDIR "/src/WebApplication43"
RUN dotnet build "WebApplication43.csproj" -c Release -o /app/build
Você pode ver que o estágio build
começa a partir de uma imagem original diferente do registro (sdk
em vez de aspnet
), em vez de continuar a partir da base. A imagem sdk
tem todas as ferramentas de compilação e, por esse motivo, é muito maior do que a imagem aspnet, que contém apenas componentes de tempo de execução. A razão para usar uma imagem separada fica clara quando você olha para o resto do Dockerfile:
# This stage is used to publish the service project to be copied to the final stage
FROM build AS publish
RUN dotnet publish "WebApplication43.csproj" -c Release -o /app/publish
# This stage is used in production or when running from VS in regular mode (Default when not using the Debug configuration)
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApplication43.dll"]
A fase final começa novamente a partir de base
e inclui o COPY --from=publish
para copiar o resultado publicado para a imagem final. Esse processo possibilita que a imagem final seja muito menor, já que não precisa incluir todas as ferramentas de construção que estavam na imagem sdk
.
A tabela a seguir resume os estágios usados no Dockerfile típico criado pelo Visual Studio:
Palco | Descrição |
---|---|
base | Cria a imagem de tempo de execução base onde o aplicativo criado é publicado. As configurações que precisam estar disponíveis em tempo de execução devem ser colocadas aqui, como portas e variáveis de ambiente. Este estágio é usado ao executar no VS no modo rápido (Padrão para configuração de Debug). |
construir | O projeto é construído nesta etapa. A imagem base do SDK do .NET é usada, que tem os componentes necessários para criar seu projeto. |
publicar | Esta etapa deriva da fase de construção e publica o seu projeto, que será copiado para a fase final. |
Finais | Esta etapa configura como iniciar o aplicativo e é usada em produção ou ao executar a partir do VS no modo regular (padrão quando não estiver usando a configuração de depuração). |
AOTDEBUG | Este estágio é usado como base para o estágio final ao iniciar a partir do VS para suportar a depuração no modo regular (padrão quando não estiver usando a configuração de depuração). |
Observação
O estágio aotdebug
só é suportado para contêineres Linux. Ele é usado no Visual Studio 2022 17.11 e em versões posteriores se implantação nativa do Ahead Of Time (AOT) estiver habilitada no projeto.
Aquecimento do projeto
Inicialização do projeto refere-se a uma série de etapas que ocorrem quando o perfil do Docker é selecionado para um projeto (ou seja, quando um projeto é carregado ou quando o suporte ao Docker é adicionado) com o objetivo de melhorar o desempenho de execuções subsequentes (F5 ou Ctrl+F5). Esse comportamento é configurável em Ferramentas>Opções>Ferramentas de Contêiner. Aqui estão as tarefas que são executadas em segundo plano:
- Verifique se o Docker Desktop está instalado e em execução.
- Verifique se o Docker Desktop está definido para o mesmo sistema operacional do projeto.
- Puxe as imagens no primeiro estágio do Dockerfile (o estágio
base
na maioria dos Dockerfiles). - Crie o Dockerfile e inicie o contêiner.
O aquecimento só acontece no modo rápido , assim, o contêiner em execução tem a pasta da aplicação montada em volume. Isso significa que quaisquer alterações no aplicativo não invalidam o contêiner. Esse comportamento melhora significativamente o desempenho de depuração e diminui o tempo de espera para tarefas de longa execução, como extrair imagens grandes.
Habilitar logs detalhados de ferramentas de contêiner
Para fins de diagnóstico, você pode habilitar determinados logs de Ferramentas de Contêiner. Você pode habilitar esses logs definindo determinadas variáveis de ambiente. Para projetos de contêiner único, a variável de ambiente é MS_VS_CONTAINERS_TOOLS_LOGGING_ENABLED
, que, em seguida, faz login em %tmp%\Microsoft.VisualStudio.Containers.Tools
. Para projetos do Docker Compose, é MS_VS_DOCKER_TOOLS_LOGGING_ENABLED
, que depois faz login %tmp%\Microsoft.VisualStudio.DockerCompose.Tools
.
Advertência
Quando o registo está ativado e está a utilizar um proxy de token para autenticação do Azure, as credenciais de autenticação podem ser registadas como texto simples. Consulte Configurar a autenticação do Azure.
Próximos passos
Saiba mais sobre como usar os estágios do Dockerfile para personalizar as imagens usadas para depuração e produção, por exemplo, como instalar uma ferramenta na imagem somente durante a depuração. Consulte Configurar imagens de contêiner para depuração.