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 公式でも説明されているので、確認しておくとよいと思われます。
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 で見つかりました。
対処方法としては、コンテナ内の適当なフォルダにプロジェクトフォルダをコピーして、ビルドを行うという方法になるようです。自分の今回のプロジェクトもそれでビルドが成功しました。
CI などでビルド用コンテナを使う場合には、リポジトリからプロジェクトを Clone してくることになるでしょうから、そのときにはコンテナ内の非マウントフォルダを使うように対策すればよさそうです。
まとめ
Windows コンテナはなかなか癖がありますね。慣れないうちは仮想マシンとしての WIndows のほうが色々と扱いやすそうです。
補足
Build Tools のインストールで必要になってくるワークロードの設定は以下のページをみると参考になると思います。