Help us understand the problem. What is going on with this article?

Visual C++開発環境をコンテナ化する

More than 1 year has passed since last update.

概要

Visual C++開発環境のコンテナ化をしました。

「コンテナーの高度な例」のサンプルを元に、Windowsの更新、コンポーネントの限定、不要ファイルの削除などの最適化を行いました。

はじめに

Visual Studio Build Toolsは、Visual Studioからエディターを取り除いたビルドのためのツールです。エディターを含まないので小さなフットプリントでインストールでき、次のような場合に有効です。

  • 好きなテキストエディタを使用するのでビルドだけ実行したい
  • ビルドの自動化をしたい(+開発マシンと別にビルドマシンを用意したい)

Visual Studio Build Toolsはコンテナへのインストールが可能で、公式の解説も用意されています。

(「Build Tools をコンテナーにインストールする」より)

Dockerfile
# escape=`

# .NET Framework 4.7.1が入った最新のWindows Server Coreイメージを使用する
FROM microsoft/dotnet-framework:4.7.1

# デフォルトのシェルを復元する(powershellなどにされている場合に備えて)
SHELL ["cmd", "/S", "/C"]

# Visual Studio Build Toolsのインストーラーを追加する
ADD https://aka.ms/vs/15/release/vs_buildtools.exe C:\TEMP\vs_buildtools.exe

# 既知の問題のあるコンポーネントを除いてインストールする
RUN C:\TEMP\vs_buildtools.exe --quiet --wait --norestart --nocache `
    --installPath C:\BuildTools `
    --all `
    --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

# Visual Studio Build Toolsの環境変数を設定してからコマンドを実行するようにする
ENTRYPOINT C:\BuildTools\Common7\Tools\VsDevCmd.bat &&

# デフォルトでPowerShellを使用する
CMD ["powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]

ただ、この通りに実行するとすべての開発環境をインストールするので、コンテナが非常に大きくなってしまいます。すべての開発環境を同時に使うことは稀だと思いますので、必要なものだけをインストールしてコンテナを小さくしましょう。

今回はC++開発環境をインストールしたので記録を残します。

注意事項

  • コンテナの最大サイズを増やしてください。ビルド実行中はメモリーを多く割り当ててください(「Build Tools をコンテナーにインストールする」を参照)。
  • WindowsにおけるDocker環境の構築については解説しません。
  • Windows 10 1809およびWindows Server 2019で実験しました。

ベースイメージを更新する

公式のDockerfileはWindows Server 2016がベースです。
今回はWindows Server Core 2019を使用してみます。

  • microsoft/dotnet-framework:4.7.2-runtime-windowsservercore-ltsc2019

Visual Studio Build Toolsをサイレントインストールする

コマンドラインオプションはVisual Studio 2017と同じです。

コンポーネントIDについてはこちらを参照してください。

問題のあるものを除くすべてのコンポーネントをインストールするコマンドラインは次の通りです。

vs_buildtools.exe --quiet --wait --norestart --nocache `
    --installPath (インストールパス) `
    --all `
    --remove Microsoft.VisualStudio.Component.Windows10SDK.10240 `
    --remove Microsoft.VisualStudio.Component.Windows10SDK.10586 `
    --remove Microsoft.VisualStudio.Component.Windows10SDK.14393 `
    --remove Microsoft.VisualStudio.Component.Windows81SDK `

これを次のように変更すると、C++開発環境のうち推奨コンポーネントまでをインストールできます。

vs_buildtools.exe --quiet --wait --norestart --nocache `
    --installPath (インストールパス) `
    --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended `

なお、サイレントインストールは回線によっては1時間以上かかります。進捗表示などが無いのでフリーズしているように見えますが、タスクマネージャーで監視したりしながら待ちましょう。

ログとインストーラーを削除する

Visual Studioのインストールログは非常に大きいので削除しましょう。同様に、インストーラーも削除することができます。
それぞれ、以下の場所にあります。

  • %USERPROFILE%\AppData\Local\Temp\
  • %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\

マルチステージビルドを使う

Visual Studio Build Toolsのインストーラーを複数回実行し、後からコンポーネントの追加・削除ができます。インストールしたコンポーネントの数で別のイメージを作る場合、これをマルチステージビルドにしておくと、ストレージ効率の良いイメージになります。

例えば以下のように、MFC, ATL, C++/CLIを追加したイメージを作れます。
(これだけで3GBほど増加します)

FROM microsoft/dotnet-framework:4.7.2-runtime-windowsservercore-ltsc2019 as recommended

# (略)

RUN C:\TEMP\vs_buildtools.exe --quiet --wait --norestart --nocache `
    --installPath C:\BuildTools `
    --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended

# (略)

FROM recommended as mfc-atl-cli

# (略)

RUN C:\TEMP\vs_buildtools.exe --quiet --wait --norestart --nocache `
    --installPath C:\BuildTools `
    --add Microsoft.VisualStudio.Component.VC.ATL `
    --add Microsoft.VisualStudio.Component.VC.ATLMFC `
    --add Microsoft.VisualStudio.Component.VC.CLI.Support

コンテナのサイズ

コンテナのサイズは9GB程になります。

  • Windows Server Core …… 4GB
  • Visual Studio Build Tools (Visual C++のみ) …… 5GB

大きいですね。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした