在C++项目的Doc容器中使用MSVC

容器封装了应用程序的运行时环境:文件系统、环境设置和虚拟化操作系统被捆绑到一个包中。 码头集装箱 自从五年前引入构建和测试环境以来,我们对构建和测试环境的思考方式发生了变化。

null

Visual Studio的安装专家, 希思斯图尔特 ,定期在博客上介绍如何安装 Visual Studio生成工具 在Windows Docker容器中。最近他解释说 为什么找不到构建工具的容器映像 . 基本上,任何安装了您不使用的工作负载的安装都会比您想要的大。你应该根据自己的需要定制一个安装程序。所以这里我们将展示如何创建和使用MSVC Docker容器。

第一步是 安装Docker社区版 . 如果未启用Hyper-V,安装程序将提示您启用它并重新启动。安装之后,您需要切换到Windows容器。关于如何 将生成工具安装到容器中 更详细地介绍了这一点。如果您提到了这一点,请在步骤5停止,并阅读以下关于创建MSVC Docker容器的说明。

记住 VS构建工具作为一种补充获得许可 到您现有的Visual Studio许可证。使用这些工具生成的任何图像都应供您个人使用,或根据您现有的VisualStudio和Windows许可证在您的组织中使用。请不要在公共Docker hub上共享这些图像。

Visual Studio生成工具Dockerfiles

为了帮助您开始创建为您的需求量身定制的Dockerfiles,我们 VS构建工具Dockerfile示例 可用。本地克隆该存储库。在那里,您将找到一个本机桌面目录,其中包含我们将用作起点的文件。如果打开Dockerfile,您将在中看到以下行。

--add Microsoft.VisualStudio.Workload.VCTools --includeRecommended 

这一行添加了VCTools工作负载和其他推荐的组件,这些组件现在包括CMake和当前的windowsdk。这是一个比我们的其他示例更小的安装,其中包括对构建托管项目和本机项目的支持。要了解有关如何找到所需组件的更多信息,请参阅我们的 其他工作负载和组件 文档。

在本机桌面目录或此repo中打开PowerShell并生成Docker映像。

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

第一次构建映像时,它将下拉windowsservercore映像,下载构建工具,并将它们安装到本地容器映像中。

完成后,您可以看到本地可用的图像。

docker imagesREPOSITORY                 TAG                            IMAGE ID       CREATED         SIZEBuildtools2017native       latest                         4ff1cd971254   3 minutes ago   14.9GBBuildtools2017             latest                         325048ba2240   4 hours ago     22.4GBmicrosoft/dotnet-framework 3.5-sdk-windowsservercore-1709 7d89a4baf66c   3 weeks ago     13.2GB

虽然我们的buildtoolsmsvc映像很大,但它明显小于包含托管支持的VS Build Tools映像。请注意,这些映像大小包括基本映像,因此就实际使用的磁盘空间而言,它们可能具有欺骗性。

尝试一下吧

让我们用一个简单的小程序测试一下构建工具容器。在VisualStudio中创建新的Windows控制台应用程序项目。添加iostream并写出一条helloworld消息。

#include "stdafx.h"#include <iostream>using namespace std;int main(){  cout << "I was built in a container..." << endl;}

我们将在以后的文章中把它部署到Windowsnano服务器容器中,因此将平台目标更改为x64。转到Project属性,在C/C++下将调试信息格式更改为C7兼容。

现在我们要为我们的项目创建一个构建容器。注意我们用来创建buildtoolsmsvc映像的Dockerfile中的这一行。

ENTRYPOINT C:BuildToolsCommon7ToolsVsDevCmd.bat &&

该行中的&&允许我们在使用此图像创建容器时传入参数。在这里,我们将使用它来传递msbuild命令以及构建解决方案所需的选项。当我们第一次启动容器时,我们将使用-v选项将本地源映射到容器中的一个目录。我们还将使用–name为容器命名,以便以后记住它的用途。这也使得在更新源代码时更容易再次运行。

docker run -v C:sourceConsoleApplication1:c:ConsoleApplication1 --name ConsoleApplication1 buildtoolsmsvc msbuild c:ConsoleApplication1ConsoleApplication1.sln /p:Configuration=Debug /p:Platform=x64

这将启动一个容器,使用msbuild构建我们的解决方案,然后退出并停止容器。您应该在进程运行时看到它的输出。由于我们映射到本地卷,您将在x64Debug下的解决方案目录下找到生成输出。您可以从那里运行ConsoleApplication1.exe,您将看到输出

I was built in a container...

在更改源代码时,可以通过运行此命令再次运行容器(如果不需要查看容器中的输出,请省略-a attach选项)。

docker start -a ConsoleApplication1

结论

这使我们在一个孤立的、易于使用的Docker容器中获得了一个可以工作的MSVC工具集。现在,您可以使用上面概述的方法为不同的项目增加额外的容器。使用同一基本映像的附加容器所使用的磁盘空间与旋转vm以获得隔离的构建环境相比是微乎其微的。

在以后的文章中,我们将介绍如何从这个进程获取构建输出,在容器中运行它,然后附加到容器中的进程并调试它。

如果您正在使用容器或使用C++进行云开发,我们将很乐意听到您的消息。如果您能抽出几分钟时间来参加我们的会议,我们将不胜感激 C++云与集装箱发展概况 . 这将有助于我们把重点放在博客和产品改进方面对您很重要的话题上。

© 版权声明
THE END
喜欢就支持一下吧,技术咨询可以联系QQ407933975
点赞0 分享