Build Tools をコンテナーにインストールする

Visual Studio Build Tools を Windows コンテナーにインストールして、継続的インテグレーションと継続的デリバリー (CI/CD) のワークフローをサポートできます。 この記事では、必要な Docker 構成の変更と、コンテナーにインストールできるワークロードとコンポーネントについて説明します。

コンテナーは一貫性のあるビルド システムをパッケージ化する優れた手段であり、CI/CD サーバー環境でだけでなく、開発環境でも使うことができます。 たとえば、カスタマイズされた環境でビルドされるようにコンテナーにソース コードをマウントしながら、Visual Studio や他のツールを使って引き続きコードを記述することができます。 お使いの CI/CD ワークフローが同じコンテナー イメージを使っている場合、コードのビルドの一貫性を心配する必要はありません。 実行時の一貫性を保つためにコンテナーを使うこともでき、これはオーケストレーション システムで複数のコンテナーを使っているマイクロサービスでは一般的なことですが、この記事ではそれについては説明しません。

ご自分のソース コードのビルドに必要な機能が Visual Studio Build Tools にない場合は、他の Visual Studio 製品に対して同じ手順を使うことができます。 ただし、Windows コンテナーは対話型のユーザー インターフェイスをサポートしていないため、すべてのコマンドを自動化する必要があることにご注意ください。

準備

以下では、Docker に関するある程度の知識をお持ちであることが想定されています。 Windows 上での Docker の実行にまだ慣れていない場合は、Windows 上での Docker エンジンのインストールと構成方法をご確認ください。

以下の基本イメージはサンプルであり、お客様のシステムでは機能しない場合があります。 ご自身の環境に対してどの基本イメージを使うべきか判断するには、「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 ビットをターゲットにするには、ENTRYPOINT コマンドで -arch=amd64 オプションを指定して、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 以降のタグが付いたイメージでは、既定の SHELL として PowerShell が使用されている可能性があり、その場合 RUN および ENTRYPOINT 命令は失敗することに注意してください。

    どのコンテナー OS バージョンがどのホスト OS バージョン上でサポートされているかについては「Windows コンテナーのバージョンの互換性」を、既知の問題については「Windows および Build Tools コンテナーのトラブルシューティング」をご参照ください。

    # 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 ビットをターゲットにするには、ENTRYPOINT コマンドで -arch=amd64 オプションを指定して、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 以降のタグが付いたイメージでは、既定の SHELL として PowerShell が使用されている可能性があり、その場合 RUN および ENTRYPOINT 命令は失敗することに注意してください。

    どのコンテナー OS バージョンがどのホスト OS バージョン上でサポートされているかについては「Windows コンテナーのバージョンの互換性」を、既知の問題については「Windows および Build Tools コンテナーのトラブルシューティング」をご参照ください。

    Note

    エラー コード 3010 は、再起動が必要な成功を示すために使用されます。詳細については、MsiExec.exe のエラー メッセージに関する記事を参照してください。

  5. そのディレクトリで次のコマンドを実行します。

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

    このコマンドは、2 GB のメモリを使って現在のディレクトリに Dockerfile をビルドします。 一部のワークロードがインストールされている場合、既定の 1 GB では不十分です。ただし、ビルドの要件によっては、1 GB のメモリだけでもビルドできる場合があります。

    最後のイメージには "buildtools2019:latest" というタグが付きます。"latest" タグはタグが指定されていない場合の既定値なので、コンテナー内では "buildtools2019" として簡単に実行することができます。 さらに高度なシナリオで特定のバージョンの Visual Studio Build Tools 2019 を使いたい場合は、"latest" 意外にも特定の Visual Studio ビルド番号でコンテナーにタグを付けて、コンテナーが特定のバージョンを一貫して使用できるようにできます。

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

    このコマンドは、2 GB のメモリを使って現在のディレクトリに Dockerfile をビルドします。 ワークロードを何かインストールするときは、既定の 1 GB では不十分です。ただし、ビルドの要件によっては、1 GB のメモリだけでもビルドできる場合があります。

    最後のイメージには "buildtools:latest" というタグが付きます。"latest" タグはタグが指定されていない場合の既定値なので、コンテナー内では "buildtools" として簡単に実行できます。 さらに高度なシナリオで特定のバージョンの Visual Studio Build Tools を使用したい場合は、"latest" 以外にも特定の Visual Studio ビルド番号でコンテナーにタグを付けて、コンテナーが特定のバージョンを一貫して使用できるようにできます。

ビルドされたイメージを使う

イメージができたので、それをコンテナーで実行して対話型と自動の両方のビルドを行うことができます。 この例では開発者コマンド プロンプトを使うので、PATH および他の環境変数は既に構成されています。

  1. コマンド プロンプトを開きます。

  2. コンテナーを実行し、すべての開発者環境変数が設定された状態で PowerShell 環境を開始します。

    docker run -it buildtools2019
    
    docker run -it buildtools
    

このイメージを CI/CD ワークフローで使うには、独自の Azure Container Registry または他の内部 Docker レジストリに発行して、サーバーがそれを取得するだけで済むようにします。

注意

Docker コンテナーを起動できない場合は、Visual Studio のインストールに問題がある可能性があります。 Dockerfile を更新して、Visual Studio のバッチ コマンドを呼び出すステップを削除できます。 これにより、Docker コンテナーを起動し、インストールのエラー ログを読み取ることができます。

Dockerfile ファイルで、ENTRYPOINT コマンドから C:\\BuildTools\\Common7\\Tools\\VsDevCmd.bat&& パラメーターを削除します。 コマンドは ENTRYPOINT ["powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"] のようになります。 次に、Dockerfile をリビルドし、run コマンドを実行してコンテナー ファイルにアクセスします。 インストールのエラー ログを見つけるには、$env:TEMP ディレクトリに移動し、dd_setup_<timestamp>_errors.log ファイルを見つけます。

インストールの問題を特定して修正したら、C:\\BuildTools\\Common7\\Tools\\VsDevCmd.bat&& パラメーターを ENTRYPOINT コマンドに追加して戻し、Dockerfile をリビルドできます。

詳しくは、「Windows および Build Tools コンテナーのトラブルシューティング」をご参照ください。

Windows および Build Tools コンテナーのトラブルシューティング

Docker コンテナーに Visual Studio をインストールする場合、いくつかの問題があります。

Windows コンテナーのトラブルシューティング

Windows コンテナーに Visual Studio Build Tools をインストールすると、以下の既知の問題が発生します。

  • イメージを構築するときに -m 2GB (またはそれ以上) を渡します。 一部のワークロードではインストール時の既定の 1 GB よりも多くのメモリを必要とします。

  • Docker で既定の 20 GB よりも多くのディスクを使用するように構成します。

  • コマンド ラインで --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'、またはその依存関係の 1 つが読み込めませんでした。 指定されたファイルが見つかりません。

Build Tools コンテナーのトラブルシューティング

ビルド ツール コンテナーを使用すると、以下の既知の問題が発生する場合があります。 問題が修正されているどうか、その他の既知の問題があるかどうかについては、Developer Community を参照してください。

  • IntelliTrace はコンテナー内の一部のシナリオでは動作しない場合があります。
  • 以前のバージョンの Docker for Windows では、コンテナー イメージの既定のサイズは 20 GB のみで、Build Tools に適合しません。 127 GB 以上にイメージのサイズを変更する手順に従ってください。 ディスク領域の問題を確認するには、ログ ファイルで詳細を確認してください。 ディスク領域が不足した場合、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.