Closed5
Docker+Windows ContainerでやってみるVisual Studioビルド
Windows+Visual Studioでしかビルドできないソフトウェアの開発をしている。
ビルド手順書が増えてきて、「環境構築をDockerfileに全部任せたいな」と思い立ったのでWindows Container+Dockerを触ってみる。
まずDocker環境を整備
Docker Desktop Installer.exe
をダウンロードしてDocker Desktopをインストール
Windows ContainerでHello World
この記事を参考に Windows ContainerでHello Worldを表示する。
やったこと
- 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
参考
ワークロード/コンポーネントのIDはここから選ぶ
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で作ったプロジェクトもビルドできる
前準備
- Visual Studio 2022 Community で
新しいプロジェクトの作成
>空のプロジェクト
で作成
(プロジェクト名はmy-project
にした) - 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が使えるか試したい。
- まずはDocker Desktopをアンインストール
https://docs.docker.com/desktop/uninstall/- ※アンインストール後、上記ページ記載のフォルダを手動で消す必要がある。
-
C:\ProgramData\Docker
はエクスプローラーからだとうまく消せないので以下の方法で強制的に消す
https://gist.github.com/nicolaskopp/de9fff4889d0ddf4c79da7ebc9e8b918
- 以下の記事を参考にWindows版のDockerを入れる。
(WSL版は不要なので、Dockerエンジン(Windows側)のインストール
項以外はスキップ。)
https://qiita.com/rabut/items/a522bf6408e3a9b69937#dockerエンジンwindows側のインストール - あとは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"
参考
このスクラップは3ヶ月前にクローズされました