Установка Build Tools в контейнер

Средства Visual Studio Build Tools можно установить в контейнере Windows для поддержки процессов непрерывной интеграции и поставки. В этой статье описываются необходимые изменения конфигурации Docker, а также рабочие нагрузки и компоненты, которые можно установить в контейнере.

Контейнеры — это отличное средство для упаковки согласованной системы сборки, которую можно использовать не только в серверной среде непрерывной интеграции и поставки, но и в средах разработки. Например, вы можете поместить исходный код в контейнер, сборка которого будет выполняться в настраиваемой среде, и в то же время продолжать использовать Visual Studio или другие средства для написания кода. Если в рамках рабочего процесса непрерывной интеграции и поставки используется тот же образ контейнера, можно быть уверенным в том, что сборка кода будет производиться согласованно. Контейнеры можно также применять для обеспечения согласованности среды выполнения. Это обычный сценарий для микрослужб, использующих несколько контейнеров с системой оркестрации, однако он выходит за рамки этой статьи.

Если возможностей средств Visual Studio Build Tools недостаточно для сборки исходного кода, эти же инструкции можно использовать для других продуктов Visual Studio. Обратите внимание, что контейнеры Windows не поддерживают интерактивный пользовательский интерфейс, поэтому все команды должны быть автоматизированы.

Подготовка к работе

Ниже предполагается, что вы знакомы с некоторыми функциями Docker. Если вы еще знаете, как работать с Docker в Windows, прочитайте статью об установке и настройке модуля Docker в Windows.

Используемый далее базовый образ является примером и может не подойти для вашей системы. Ознакомьтесь со статьей Windows container version compatibility (Совместимость версий контейнеров Windows), чтобы определить, какой базовый образ вам следует использовать для среды.

Создание и сборка Dockerfile

Сохраните приведенный ниже пример Dockerfile в новый файл на диске. Если файл имеет имя Dockerfile, он распознается по умолчанию.

Предупреждение

В этом примере файла Dockerfile исключены только более ранние пакеты Windows SDK, которые невозможно установить в контейнерах. Более ранние выпуски приводят к сбою команды сборки.

  1. Откройте командную строку.

  2. Создайте каталог (рекомендуется):

    mkdir C:\BuildTools
    
  3. Перейдите в этот каталог:

    cd C:\BuildTools
    
  4. Сохраните в каталоге C:\BuildTools\Dockerfile представленное ниже содержимое.

    # escape=`
    
    # Use the latest Windows Server Core 2019 image.
    FROM mcr.microsoft.com/windows/servercore:ltsc2019
    
    # 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/16/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\2019\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\\2019\\BuildTools\\Common7\\Tools\\VsDevCmd.bat", "&&", "powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]
    

    Совет

    Чтобы выбрать 64-разрядную версию, укажите -arch=amd64 параметр в команде ENTRYPOINT , чтобы запустить командную строку разработчика для Visual Studio (VSDevCmd.bat).

    Например: ENTRYPOINT ["C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools\\Common7\\Tools\\VsDevCmd.bat", "-arch=amd64", "&&", "powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]

    Предупреждение

    Если образ основан непосредственно на microsoft/windowsservercore, платформа .NET Framework может не установиться правильно, причем сообщения об ошибках выводиться не будут. После завершения установки управляемый код может не запускаться. Вместо этого на основе образа используется microsoft/dotnet-framework:4.8] или более поздней версии. Также обратите внимание, что образы, для которых указана версия 4.8 или более поздняя, могут использовать PowerShell в качестве SHELL по умолчанию, что будет приводить к сбою инструкций RUN и ENTRYPOINT.

    Ознакомьтесь с совместимостью версий контейнера Windows, чтобы узнать, какие версии ОС контейнера поддерживаются в версиях ос узла, а также устранение неполадок контейнеров Windows и средств сборки для известных проблем.

    # 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"]
    

    Совет

    Чтобы выбрать 64-разрядную версию, укажите -arch=amd64 параметр в команде ENTRYPOINT , чтобы запустить командную строку разработчика для Visual Studio (VSDevCmd.bat).

    Например: ENTRYPOINT ["C:\\Program Files (x86)\\Microsoft Visual Studio\\2022\\BuildTools\\Common7\\Tools\\VsDevCmd.bat", "-arch=amd64", "&&", "powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]

    Предупреждение

    Если образ основан непосредственно на microsoft/windowsservercore, платформа .NET Framework может не установиться правильно, причем сообщения об ошибках выводиться не будут. После завершения установки управляемый код может не запускаться. Вместо этого создайте образ на основе microsoft/dotnet-framework:4.8 или более поздней версии. Также обратите внимание, что образы, для которых указана версия 4.8 или более поздняя, могут использовать PowerShell в качестве SHELL по умолчанию, что будет приводить к сбою инструкций RUN и ENTRYPOINT.

    Ознакомьтесь с совместимостью версий контейнера Windows, чтобы узнать, какие версии ОС контейнера поддерживаются в версиях ос узла, а также устранение неполадок контейнеров Windows и средств сборки для известных проблем.

    Примечание.

    Код ошибки 3010 указывает на успешное выполнение, после которого требуется перезагрузка. Дополнительные сведения см. в разделе Сообщения об ошибках MsiExec.exe.

  5. Выполните в этом каталоге приведенную ниже команду.

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

    Эта команда выполняет сборку файла Dockerfile в текущем каталоге, используя 2 ГБ памяти. Значение по умолчанию 1 ГБ недостаточно при установке некоторых рабочих нагрузок; Однако вы можете создать только 1 ГБ памяти в зависимости от требований сборки.

    Окончательный образ buildtools2019:latest помечен так, чтобы его можно было легко запустить в контейнере, так как buildtools2019 тег "последняя" является значением по умолчанию, если тег не указан. Если вы хотите использовать определенную версию средств Visual Studio Build Tools 2019 в более сложном сценарии, вы можете пометить контейнер конкретным номером сборки Visual Studio, а также тегом "latest", чтобы контейнеры применяли одну и ту же версию.

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

    Эта команда выполняет сборку файла Dockerfile в текущем каталоге, используя 2 ГБ памяти. Размер памяти по умолчанию, равный 1 ГБ, недостаточен, если установлены некоторые рабочие нагрузки. Однако в зависимости от требований вам, возможно, удастся выполнить сборку, используя всего 1 ГБ памяти.

    Итоговый образ помечается как "buildtools:latest", так что вы можете легко запустить его в контейнере как "buildtools", так как "latest" — это тег по умолчанию, используемый, если тег не указан. Если вы хотите использовать определенную версию средств Visual Studio Build Tools в более сложном сценарии, вы можете пометить контейнер конкретным номером сборки Visual Studio, а также тегом "latest", чтобы контейнеры применяли одну и ту же версию.

Использование собранного образа

После создания образа его можно запустить в контейнере для выполнения как интерактивной, так и автоматической сборки. В этом примере используется Командная строка разработчика, поэтому PATH и другие переменные среды уже настроены.

  1. Откройте командную строку.

  2. Запустите контейнер, чтобы запустить среду PowerShell, в которой заданы все переменные среды разработчика:

    docker run -it buildtools2019
    
    docker run -it buildtools
    

Чтобы использовать этот образ для рабочего процесса CI/CD, его можно опубликовать в собственном Реестре контейнеров Azure или другом внутреннем реестре Docker, откуда его могут извлекать серверы.

Примечание.

Если запуск контейнера Docker завершается сбоем, скорее всего, существует проблема, связанная с установкой Visual Studio. Вы можете обновить Dockerfile, чтобы исключить шаг, вызывающий пакетную команду Visual Studio. Это позволит запустить контейнер Docker и просмотреть журналы ошибок установки.

В файле Dockerfile удалите параметры C:\\BuildTools\\Common7\\Tools\\VsDevCmd.bat и && из команды ENTRYPOINT. Теперь команда должна иметь следующий вид: ENTRYPOINT ["powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]. Затем перестройте Dockerfile и выполните команду run для доступа к файлам контейнера. Чтобы найти журналы ошибок установки, перейдите в каталог $env:TEMP и откройте файл dd_setup_<timestamp>_errors.log.

После определения и устранения проблемы с установкой можно добавить параметры C:\\BuildTools\\Common7\\Tools\\VsDevCmd.bat и && обратно в команду ENTRYPOINT и перестроить Dockerfile.

Дополнительные сведения см. в разделе "Устранение неполадок контейнеров Windows и средств сборки".

Устранение неполадок контейнеров Средств сборки и Windows

Существует несколько проблем, возникающих при установке Visual Studio в контейнер Docker.

Устранение неполадок контейнеров Windows

Указанные ниже известные проблемы возникают при установке Visual Studio Build Tools в контейнер Windows.

  • Передайте -m 2GB (или больше) при сборке образа. Некоторым рабочим нагрузкам требуется больше памяти, чем 1 ГБ, назначаемый по умолчанию при установке.

  • Настройте Docker для использования дисков, размер которых больше стандартных 20 ГБ.

  • Передайте --norestart в командной строке. На момент публикации при попытке перезапустить контейнер Windows из контейнера на узел возвращается ERROR_TOO_MANY_OPEN_FILES.

  • Если образ основан непосредственно на mcr.microsoft.com/windows/servercore, платформа .NET Framework может не установиться правильно, причем сообщения об ошибках выводиться не будут. После завершения установки управляемый код может не запускаться. Вместо этого создайте образ на основе microsoft/dotnet-framework:4.7.1 или более поздней версии. Например, при выполнении сборки с помощью MSBuild может возникнуть ошибка, аналогичная следующей:

    C:\BuildTools\MSBuild\15.0\bin\Roslyn\Microsoft.CSharp.Core.targets(84,5): ошибка MSB6003: Не удалось запустить указанный исполняемый файл задачи "csc.exe". Не удалось загрузить файл или сборку "System.IO.FileSystem, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" или одну из их зависимостей. Системе не удается найти указанный файл.

Устранение неполадок контейнеров средств сборки

При использовании контейнера Build Tools могут возникнуть указанные ниже известные проблемы. Чтобы узнать, устранены ли эти проблемы и имеются ли другие известные проблемы, посетите сайт сообщества разработчиков.

  • IntelliTrace может не работать в некоторых сценариях внутри контейнера.
  • В старых версиях Docker для Windows размера образа контейнера по умолчанию составлял всего 20 ГБ и не поддерживался Build Tools. Выполните инструкции, чтобы задать для образа размер 127 ГБ или больше. Чтобы убедиться в наличии проблемы с дисковым пространством, проверьте файлы журнала для получения дополнительных сведений. Файл vslogs\dd_setup_<timestamp>_errors.log будет содержать следующее, если места на диске недостаточно:
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.