Closed5

Docker+Windows ContainerでやってみるVisual Studioビルド

かめっちかめっち

Windows+Visual Studioでしかビルドできないソフトウェアの開発をしている。
ビルド手順書が増えてきて、「環境構築をDockerfileに全部任せたいな」と思い立ったのでWindows Container+Dockerを触ってみる。

まずDocker環境を整備

Docker Desktop Installer.exe をダウンロードしてDocker Desktopをインストール
https://docs.docker.jp/desktop/install/windows-install.html#id5

Windows ContainerでHello World

この記事を参考に Windows ContainerでHello Worldを表示する。
https://blog.jp.square-enix.com/iteng-blog/posts/00040-windows-container-with-docker/

やったこと

  • Windowsの機能から Hyper-V、Container 機能を有効化
  • Switch to Windows containers... を押してWindowsモードに切り替え (UIが変わっていてタスクトレイにあるので注意)
  • docker runコマンドで、コンテナ内でcmdを叩いて、Hello Worldを表示する
    PS> docker run -v C:\temp:C:\work mcr.microsoft.com/windows/nanoserver:ltsc2019 cmd.exe /s /c type C:\work\Hello.txt
    Hello, world!
    

できた

PS C:\WINDOWS\system32> docker run -v C:\temp:C:\work mcr.microsoft.com/windows:ltsc2019 cmd.exe /s /c type C:\work\Hello.txt
Hogehogeこんにちわ
かめっちかめっち

Visual Studioのcl.exeを動かしてみる

Dockerfile
FROM mcr.microsoft.com/windows/servercore:ltsc2022
LABEL maintainer=kamesuta@gmail.com description="VC++2022 + Windows SDK"

# vs_buildtools.exe と nuget.exe をダウンロード
ADD https://aka.ms/vs/17/release/vs_buildtools.exe C:\\Downloads\\vs_buildtools.exe

# C++デスクトップワークロード をインストール
RUN C:\\Downloads\\vs_buildtools.exe --quiet --wait --norestart \
    --add Microsoft.VisualStudio.Workload.VCTools \
    --add Microsoft.VisualStudio.Workload.NativeDesktop \
    --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 \
    --add Microsoft.VisualStudio.Component.Windows10SDK.20348 \
    --add Microsoft.Component.VC.Runtime.UCRTSDK

# Path に必要なフォルダを追加
RUN SETX /M Path "%Path%;C:\\Program Files (x86)\\Microsoft Visual Studio\\2022\\BuildTools\\MSBuild\\15.0\\Bin"

# エントリポイントを設定
ENTRYPOINT ["C:\\Program Files (x86)\\Microsoft Visual Studio\\2022\\BuildTools\\Common7\\Tools\\VsDevCmd.bat", "-arch=amd64", "&&", "cmd","/S","/C"]
main.cpp
#include <iostream>

int main()
{
	std::cout << "HELLOOOO" << std::endl;
	return 0;
}
docker build . -t my-msbuild
docker run --rm -v ${PWD}:C:/src my-msbuild cl C:\src\main.cpp /EHsc /Fe:C:\src\main.exe

ビルド&実行できた

PS D:\playground\docker-playground> docker run --rm -v ${PWD}:C:/src my-msbuild cl C:\src\main.cpp /EHsc /Fe:C:\src\main.exe
**********************************************************************
** Visual Studio 2022 Developer Command Prompt v17.13.6
** Copyright (c) 2022 Microsoft Corporation
**********************************************************************
Microsoft (R) C/C++ Optimizing Compiler Version 19.43.34810 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

main.cpp
Microsoft (R) Incremental Linker Version 14.43.34810.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:C:\src\main.exe
main.obj
PS D:\playground\docker-playground> .\main.exe
HELLOOOO

参考

https://github.com/compulim/docker-msbuild
https://learn.microsoft.com/ja-jp/visualstudio/install/build-tools-container?view=vs-2022#create-and-build-the-dockerfile

ワークロード/コンポーネントのIDはここから選ぶ

https://learn.microsoft.com/ja-jp/visualstudio/install/workload-component-id-vs-community?view=vs-2022
https://learn.microsoft.com/ja-jp/visualstudio/install/workload-component-id-vs-build-tools?view=vs-2022

Dockerコンテナの中に潜って調べる

docker run --rm -it -v D:/softdata/git/playground/docker-playground:C:/src --entrypoint powershell my-msbuild

# コンテナ内に入ったので調べる
PS C:\> dir 'C:\Program Files (x86)\Windows Kits\'
かめっちかめっち

Visual Studioのプロジェクトをビルドする

もちろんVisualStudioで作ったプロジェクトもビルドできる

前準備

  1. Visual Studio 2022 Community で 新しいプロジェクトの作成 > 空のプロジェクト で作成
    (プロジェクト名は my-project にした)
  2. main.cppを追加する

ビルド

docker run --rm -v ${PWD}:C:/src my-msbuild msbuild C:\src\my-project.sln /t:Build
かめっちかめっち

Windows Container を WSL でやる

商用利用に規制のある Docker Desktop を入れなくてもWindows Containerが使えるか試したい。

  1. まずはDocker Desktopをアンインストール
    https://docs.docker.com/desktop/uninstall/
  2. 以下の記事を参考にWindows版のDockerを入れる。
    (WSL版は不要なので、Dockerエンジン(Windows側)のインストール項以外はスキップ。)
    https://qiita.com/rabut/items/a522bf6408e3a9b69937#dockerエンジンwindows側のインストール
  3. あとはDocker Desktopのときと同様の手順で問題なく動作した。
かめっちかめっち

管理者権限じゃなくてもdockerが叩けるようにする (任意)

管理者権限以外でdockerを使うとエラーになり不便。

PS C:\Users\Kamesuta> docker ps
error during connect: This error may indicate that the docker daemon is not running.: Get "http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/containers/json": open //./pipe/docker_engine: Access is denied.

通常ユーザーに権限を付与し、管理者権限じゃなくてもdockerコマンドが使えるようにする

PS C:\docker> Install-Module -Name dockeraccesshelper

信頼されていないリポジトリ
信頼されていないリポジトリからモジュールをインストールしようとしています。このリポジトリを信頼する場合は、Set-PSReposit
ory コマンドレットを実行して、リポジトリの InstallationPolicy の値を変更してください。'PSGallery'
からモジュールをインストールしますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): Y
PS C:\docker> Import-Module dockeraccesshelper
PS C:\docker> whoami
kamesuta-pc\kamesuta
PS C:\docker> Add-AccountToDockerAccess "Kamesuta-PC\Kamesuta"

参考

https://www.axians-infoma.de/techblog/allow-access-to-the-docker-engine-without-admin-rights-on-windows/

このスクラップは3ヶ月前にクローズされました