Partilhar via


Instalar ferramentas de compilação em um contêiner

Você pode instalar o Visual Studio Build Tools em um contêiner do Windows para oferecer suporte a fluxos de trabalho de integração contínua e entrega contínua (CI/CD). Este artigo orienta você sobre quais alterações de configuração do Docker são necessárias, bem como quais cargas de trabalho e componentes você pode instalar em um contêiner.

Containers são uma ótima maneira de empacotar um sistema de compilação consistente que você pode usar, não apenas em um ambiente de servidor CI/CD, mas também para ambientes de desenvolvimento. Por exemplo, você pode montar seu código-fonte em um contêiner a ser criado por um ambiente personalizado enquanto continua a usar o Visual Studio ou outras ferramentas para escrever seu código. Se o fluxo de trabalho de CI/CD usar a mesma imagem de contêiner, você pode ter certeza de que seu código é compilado de forma consistente. Você também pode usar contêineres para consistência de tempo de execução, o que é comum para microsserviços que usam vários contêineres com um sistema de orquestração; no entanto, isso está além do escopo deste artigo.

Se o Visual Studio Build Tools não tiver o que você precisa para criar seu código-fonte, essas mesmas etapas podem ser usadas para outros produtos do Visual Studio. Observe, no entanto, que os contêineres do Windows não suportam uma interface de usuário interativa, portanto, todos os comandos devem ser automatizados.

Antes de começar

Presume-se alguma familiaridade com Docker. Se você não estiver familiarizado com ele, saiba como instalar e configurar o mecanismo Docker no Windows.

A imagem base a seguir é um exemplo e pode não funcionar para o seu sistema. Leia Compatibilidade da versão do contêiner do Windows para determinar qual imagem base deve usar para o seu ambiente.

Criar e construir o Dockerfile

Salve o exemplo a seguir Dockerfile em um novo arquivo no disco. Se o arquivo for nomeado simplesmente Dockerfile, ele será reconhecido por padrão.

Advertência

Este exemplo Dockerfile exclui apenas SDKs anteriores do Windows que não podem ser instalados em contêineres. Versões anteriores fazem com que o comando build falhe.

  1. Abra um prompt de comando.

  2. Crie um novo diretório (recomendado):

    mkdir C:\BuildTools
    
  3. Altere os diretórios para este novo diretório:

    cd C:\BuildTools
    
  4. Salve o seguinte conteúdo em C:\BuildTools\Dockerfile.

    # escape=`
    
    # Use the latest Windows Server Core 2022 image.
    FROM mcr.microsoft.com/windows/servercore:ltsc2022
    
    # Restore the default Windows shell for correct batch processing.
    SHELL ["cmd", "/S", "/C"]
    
    RUN `
        # Download the Build Tools bootstrapper.
        curl -SL --output vs_buildtools.exe https://aka.ms/vs/17/release/vs_buildtools.exe `
        `
        # Install Build Tools with the Microsoft.VisualStudio.Workload.AzureBuildTools workload, excluding workloads and components with known issues.
        && (start /w vs_buildtools.exe --quiet --wait --norestart --nocache `
            --installPath "%ProgramFiles(x86)%\Microsoft Visual Studio\2022\BuildTools" `
            --add Microsoft.VisualStudio.Workload.AzureBuildTools `
            --remove Microsoft.VisualStudio.Component.Windows10SDK.10240 `
            --remove Microsoft.VisualStudio.Component.Windows10SDK.10586 `
            --remove Microsoft.VisualStudio.Component.Windows10SDK.14393 `
            --remove Microsoft.VisualStudio.Component.Windows81SDK `
            || IF "%ERRORLEVEL%"=="3010" EXIT 0) `
        `
        # Cleanup
        && del /q vs_buildtools.exe
    
    # Define the entry point for the docker container.
    # This entry point starts the developer command prompt and launches the PowerShell shell.
    ENTRYPOINT ["C:\\Program Files (x86)\\Microsoft Visual Studio\\2022\\BuildTools\\Common7\\Tools\\VsDevCmd.bat", "&&", "powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]
    

    Dica

    Para direcionar para 64 bits, especifique a opção -arch=amd64 no comando ENTRYPOINT para iniciar o prompt de comando do desenvolvedor para Visual Studio (VSDevCmd.bat).

    Por exemplo: ENTRYPOINT ["C:\\Program Files (x86)\\Microsoft Visual Studio\\2022\\BuildTools\\Common7\\Tools\\VsDevCmd.bat", "-arch=amd64", "&&", "powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]

    Advertência

    Se baseares a tua imagem diretamente em microsoft/windowsservercore, o .NET Framework pode não ser instalado corretamente e não é indicado nenhum erro de instalação. O código gerenciado pode não ser executado após a conclusão da instalação. Em vez disso, baseie a sua imagem em microsoft/dotnet-framework:4.8 ou posterior. Observe também que as imagens marcadas com a versão 4.8 ou posterior podem usar o PowerShell como o SHELLpadrão, o que pode fazer com que as instruções RUN e ENTRYPOINT falhem.

    Para saber quais versões do SO de contêiner são suportadas em quais versões do SO host, consulte Compatibilidade de versão de contêiner do Windows. Verifique Solução de problemas do Windows e contêineres de ferramentas de compilação para problemas conhecidos.

    Observação

    O código de erro 3010 é usado para indicar o sucesso com uma reinicialização necessária. Para obter mais informações, consulte MsiExec.exe mensagens de erro.

  5. Execute o seguinte comando dentro desse diretório.

    docker build -t buildtools:latest -m 2GB .
    

    Este comando cria o Dockerfile no diretório atual usando 2 GB de memória. O padrão de 1 GB não é suficiente quando algumas cargas de trabalho são instaladas; no entanto, você pode ser capaz de construir com apenas 1 GB de memória, dependendo dos seus requisitos de compilação.

    A imagem final é marcada buildtools:latest para que possas executá-la facilmente num contentor como buildtools, já que a etiqueta mais recente é o padrão caso nenhuma etiqueta seja especificada. Se você quiser usar uma versão específica do Visual Studio Build Tools em um cenário mais avançado, você pode, em vez disso, marcar o contêiner com um número de compilação específico do Visual Studio, bem como mais recente para que os contêineres possam usar uma versão específica de forma consistente.

Use a imagem construída

Agora que você criou uma imagem, pode executá-la em um contêiner para fazer compilações interativas e automatizadas. O exemplo usa o prompt de comando do desenvolvedor, portanto, seu PATH e outras variáveis de ambiente já estão configurados.

  1. Abra um prompt de comando.

  2. Execute o contêiner para iniciar um ambiente do PowerShell com todas as variáveis de ambiente do desenvolvedor definidas:

    docker run -it buildtools
    

Para usar esta imagem para o seu fluxo de trabalho de CI/CD, pode publicá-la no seu próprio Registro de Contêiner do Azure ou em outro registo interno do Docker, para que os servidores só precisem extrair.

Observação

Se o contêiner do Docker falhar ao iniciar, provavelmente haverá um problema de instalação do Visual Studio. Você pode atualizar o Dockerfile para remover a etapa que chama o comando em lote do Visual Studio. Isso permite que você inicie o contêiner do Docker e leia os logs de erros de instalação.

No arquivo Dockerfile, remova os parâmetros C:\\BuildTools\\Common7\\Tools\\VsDevCmd.bat e && do comando ENTRYPOINT. O comando agora deve ser ENTRYPOINT ["powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]. Em seguida, reconstrua o Dockerfile e execute o comando run para acessar arquivos contêiner. Para localizar os logs de erro de instalação, vá para o diretório $env:TEMP e localize o arquivo dd_setup_<timestamp>_errors.log.

Depois de identificar e corrigir o problema de instalação, você pode adicionar os parâmetros C:\\BuildTools\\Common7\\Tools\\VsDevCmd.bat e && de volta ao comando ENTRYPOINT e reconstruir seu Dockerfile.

Para obter mais informações, consulte Solução de problemas de containers do Windows e das Ferramentas de Compilação.

Solução de problemas de contêineres do Windows e das Ferramentas de Criação

Há alguns problemas ao instalar o Visual Studio em um contêiner do Docker.

Solucionar problemas de contêineres do Windows

Os seguintes problemas conhecidos ocorrem quando você instala o Visual Studio Build Tools em um contêiner do Windows.

  • Passe -m 2GB (ou mais) ao criar a imagem. Algumas cargas de trabalho exigem mais memória do que os 1 GB padrão quando instaladas.

  • Configure o Docker para usar discos maiores que os 20 GB padrão.

  • Passe --norestart na linha de comando. No momento em que este artigo foi escrito, a tentativa de reiniciar um contêiner do Windows de dentro do contêiner retorna ERROR_TOO_MANY_OPEN_FILES para o host.

  • Se basear a sua imagem diretamente no mcr.microsoft.com/windows/servercore, o .NET Framework pode não ser instalado corretamente e não é indicado nenhum erro de instalação. O código gerenciado pode não ser executado após a conclusão da instalação. Em vez disso, baseie sua imagem em microsoft/dotnet-framework:4.7.1 ou posterior. Como exemplo, você pode ver um erro ao criar com o MSBuild semelhante ao seguinte:

    C:\BuildTools\MSBuild\15.0\bin\Roslyn\Microsoft.CSharp.Core.targets(84,5): erro MSB6003: O executável especificado da tarefa "csc.exe" não pôde ser executado. Não foi possível carregar o arquivo ou assembly 'System.IO.FileSystem, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' ou uma de suas dependências. O sistema não consegue encontrar o ficheiro especificado.

Solucionar problemas de contêineres de ferramentas de compilação

Os seguintes problemas conhecidos podem ocorrer quando você usa um contêiner de ferramentas de compilação. Para ver se os problemas foram corrigidos ou se existem outros problemas conhecidos, visite Comunidade de Programadores.

  • O IntelliTrace pode não funcionar em alguns cenários dentro de um contêiner.
  • Em versões mais antigas do Docker para Windows, o tamanho padrão da imagem do contêiner é de apenas 20 GB e não se encaixa nas Ferramentas de Compilação. Siga a instrução para alterar o tamanho da imagem para 127 GB ou mais. Para confirmar um problema de espaço em disco, verifique os arquivos de log para obter mais informações. Seu arquivo vslogs\dd_setup_<timestamp>_errors.log inclui o seguinte se você ficar sem espaço em disco:
Pre-check verification: Visual Studio needs at least 91.99 GB of disk space. Try to free up space on C:\ or change your target drive.
Pre-check verification failed with error(s) :  SizePreCheckEvaluator.