ビルド ツールをコンテナーにインストールする

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 コンテナーのバージョンの互換性を読み、環境に使用する基本イメージを決定します。

Dockerfile を作成してビルドする

次の Dockerfile の例をディスク上の新しいファイルに保存します。 ファイルに単に Dockerfile という名前が付けられている場合は、既定で認識されます。

Warnung

この例の Dockerfile では、コンテナーにインストールできない以前の Windows SDK のみが除外されます。 以前のリリースでは、ビルド コマンドが失敗します。

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

  2. 新しいディレクトリを作成します (推奨)。

    mkdir C:\BuildTools
    
  3. ディレクトリを次の新しいディレクトリに変更します。

    cd C:\BuildTools
    
  4. 次の内容を C:\BuildTools\Dockerfile に保存します。

    # escape=`
    
    # Use the latest .NET Framework runtime image.
    FROM mcr.microsoft.com/dotnet/framework/runtime:4.8.1-windowsservercore-ltsc2025
    
    # 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/stable/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\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\\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\\BuildTools\\Common7\\Tools\\VsDevCmd.bat", "-arch=amd64", "&&", "powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]

    Warnung

    イメージを microsoft/windowsservercore に直接基づくと、.NET Framework が正しくインストールされず、インストール エラーが表示されない可能性があります。 インストールが完了した後にマネージド コードが実行されない場合があります。 代わりに、 microsoft/dotnet-framework:4.8 以降に基づいてイメージを作成します。 また、バージョン 4.8 以降にタグ付けされたイメージでは、既定の SHELLとして PowerShell が使用される可能性があるため、 RUN と ENTRYPOINT の手順が失敗します。

    どのホスト OS バージョンでどのコンテナー OS バージョンがサポートされているかについては、 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"]

    Warnung

    イメージを microsoft/windowsservercore に直接基づくと、.NET Framework が正しくインストールされず、インストール エラーが表示されない可能性があります。 インストールが完了した後にマネージド コードが実行されない場合があります。 代わりに、 microsoft/dotnet-framework:4.8 以降に基づいてイメージを作成します。 また、バージョン 4.8 以降にタグ付けされたイメージでは、既定の SHELLとして PowerShell が使用される可能性があるため、 RUN と ENTRYPOINT の手順が失敗します。

    どのホスト OS バージョンでどのコンテナー OS バージョンがサポートされているかについては、 Windows コンテナーのバージョンの互換性に関するページを参照してください。 既知の問題については、Windows コンテナーとビルド ツール コンテナーのトラブルシューティングを確認してください。

    注

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

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

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

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

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

ビルドされたイメージを使用する

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

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

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

    docker run -it buildtools
    

CI/CD ワークフローにこのイメージを使用するには、独自の Azure Container Registry またはその他の内部 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 コンテナーとビルド ツール コンテナーのトラブルシューティング

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

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

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

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

  • 既定の 20 GB を超えるディスクを使用するように Docker を構成します。

  • コマンド ラインで --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 for Windows では、既定のコンテナー イメージ サイズはわずか 20 GB で、ビルド ツールには適合しません。 指示に従って、イメージ サイズを 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.