Windows コンテナで VC++ プロジェクトのビルド環境を作る

Windows コンテナ(Windows Container) で Visual C++ プロジェクトのビルド環境を構成してみました。Windows コンテナはデスクトップ環境を持つわけではないので、 Visual Studio をインストールして IDE ありで使うことはできません。しかし、 VS Build Tools をインストールして、 .sln や .vcxproj をビルド処理することはできます。

今回はこちらを確認してみたので、その手順を説明します。

Windows コンテナの準備

Windows コンテナにフリーで使える Build Tools をインストールします。
インストール作業は短時間では終わらないため、イメージをビルドしてしまい、それを各場目で使うという形で使うことにします。
またインストール中(イメージ構築中)も詳細な情報は出てこないため、環境にも依存するでしょうが気長に待つくらいが必要です。

イメージをビルドするために必要な Dockerfile は以下のものです。
現在の環境に合わせるために、バージョンは 2004 を使用しています。
また、 Visual Studio 2017/2019 らの VC++ プロジェクトをビルドさせる都合で、ツールセットや Windows SDK の追加を行っています。
この箇所については、状況に合わせて変更するのがよいと思います。

# escape=`

FROM mcr.microsoft.com/windows:2004

SHELL  [ "cmd", "/S", "/C" ]

ADD https://aka.ms/vs/16/release/vs_buildtools.exe C:\temp\vs_buildtools.exe

RUN C:\TEMP\vs_buildtools.exe --quiet --wait --norestart --nocache `
    --installPath C:\BuildTools `
    --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended  `
    --add Microsoft.VisualStudio.Component.VC.ATL `
    --add Microsoft.VisualStudio.Component.VC.ATLMFC `
    --add Microsoft.VisualStudio.Component.VC.CLI.Support    `
    --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

RUN C:\TEMP\vs_buildtools.exe --quiet --wait --norestart --nocache `
    --installPath C:\BuildTools `
    --add Microsoft.VisualStudio.Component.Windows10SDK.17763 `
    --add Microsoft.VisualStudio.Component.VC.v141.x86.x64 `
    || IF "%ERRORLEVEL%"=="3010" EXIT 0

# Visual Studio Build Toolsの環境変数を設定してからコマンドを実行するようにする
ENTRYPOINT ["C:\\BuildTools\\Common7\\Tools\\VsDevCmd.bat", "&&", "powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]

この Dockerfile からイメージを作るために以下のコマンドを実行します (Dockerfile を設置した場所で実行)。

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

ビルド環境を作ると予想よりはディスク容量を使うため注意が必要です。今回作ってみた環境では、 26.5 GB ほどを使用しているようでした。

Windows コンテナに Build Tools をインストールする方法は、 Microsoft 公式でも説明されているので、確認しておくとよいと思われます。

Visual Studio Build Tools をコンテナーにインストールする
Visual Studio Build Tools を Windows コンテナーにインストールして、継続的インテグレーションと継続的デリバリー (CI/CD) のワークフローをサポートする方法を説明します。

VC++ プロジェクトをビルドしてみる

準備したコンテナで VC++ プロジェクトをビルドさせてみます。まずは以下のようなコマンドでプロジェクトフォルダをマウントしつつ、 コンテナ環境に入ってみましょう。

docker run -it --rm -v D:\Dev\d3d12_book_1:c:\work myvcbuild:latest 

この図は Visual Studio Code のターミナルでコンテナ環境に入ったものですが、 Visual Studio 2019 の開発者用コマンドプロンプトを開いたときのようなメッセージと、コンテナ内のクリーンな環境を確認できると思います。

ボリュームマウントしたディレクトリでのビルドは成功しない

ここで早速プロジェクトをビルドさせてみます。が、以下のようにエラーが発生して成功しません。

error C2471: cannot update program database 'C:\work\01_ClearScreen\x64\Debug\vc14
1.idb' [C:\work\01_ClearScreen\01_ClearScreen.vcxproj]

これはボリュームマウントしたプロジェクトフォルダが原因で失敗するようです。同じ事例が GitHub で見つかりました。

C++ debug build fails in mounted volume in Docker container · Issue #3360 · dotnet/msbuild
Steps to reproduce Create a Windows Server Core Docker image with VS Build Tools 15.7 (lower should have the same issue). Start a container with a folder from t...

対処方法としては、コンテナ内の適当なフォルダにプロジェクトフォルダをコピーして、ビルドを行うという方法になるようです。自分の今回のプロジェクトもそれでビルドが成功しました。
CI などでビルド用コンテナを使う場合には、リポジトリからプロジェクトを Clone してくることになるでしょうから、そのときにはコンテナ内の非マウントフォルダを使うように対策すればよさそうです。

まとめ

Windows コンテナはなかなか癖がありますね。慣れないうちは仮想マシンとしての WIndows のほうが色々と扱いやすそうです。

今回ビルド対象に選んだのが DirectX12 Programming Vol.1 で使用しているプロジェクトです。これが Visual Studio 2017 および ちょっと古い Windows SDK を使っていたので、上記にあげた Dockerfile の設定となりました。最新の環境だけに絞るのならば、追加の ツールセットや Windows SDK は不要です。

補足

Build Tools のインストールで必要になってくるワークロードの設定は以下のページをみると参考になると思います。

Visual Studio Build Tools workload and component IDs
Use Visual Studio workload and component IDs to build classic Windows-based applications
プログラミング
すらりんをフォローする
すらりん日記

コメント

タイトルとURLをコピーしました