Docker for Windows部署VC++编译的EXE程序方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/l491453302/article/details/80807861

1 前言

 因为想在项目中构建微服务来管理不同单位开发的分析算法,所以选择了Docker+Kubernets的方案。之前一直有个疑惑:有的单位开发的算法是采用Visual Studio编译的,这种windows平台下生成的exe程序能在Docker中部署吗?这个疑问源自对Docker的不了解,一直以为其是Linux下的东西,但是通过查看多方资料,得出的结论是肯定的,可以直接通过Docker for Windows来实现,只是用这种方式的人很少而已,国内的博客上似乎很少,几乎找不到相关的东西,坑太多需要自己去填。

2 环境配置

首先需要在Docker Store下载Docker CE for Windows,地址:https://store.docker.com/editions/community/docker-ce-desktop-windows,这里需要先注册后下载。下载后的安装就一路默认即可,中间有个地方可能需要根据自己的情况选择:Switch to Windows Container。据说安装的时候需要开启Hyper-V,因为我的电脑一直开启着的所以没有遇到这方面的提示,安装完后会要求重启计算机。

安装完毕后,电脑右下角的托盘中就会有灰色小鲸鱼的小图标了(不太明白为什么是灰色而不是蓝色),这时一般我们会配置镜像加速,我选择的是阿里云镜像加速,地址:https://dev.aliyun.com/search.html,登陆后,点击管理中心--镜像加速(左侧),这时你可以看到【您的专属加速地址】,把这个地址拷贝下来。再右键点击计算机右下角托盘里面的小鲸鱼,选择Setting\Daemon,把刚才的地址放到Daemon的Json对象的registry-mirros数组中,这个数组的元素是string,所以记得在自己的地址上打上“”符号,最后apply,重启docker即可。

3 VC++程序部署

这是我使用windows版本的docker的主要目的,也是绕了我不少时间的地方。Microsoft提供了两个基础的镜像用于构建Windows APP部署的Docker:microsoft/nanoserver和microsoft/windowsservercore,如果你了解下这两个镜像就会知道他们非常庞大,前者1G多,后者10G多,明白人一上来可能就会选择镜像大小小的nanoserver作为基镜像,但是在我自己的实际测试中,nanoserver构建的镜像在跑C++程序时,既不报错也不按照程序原本的设计打印输出信息,折磨人得很。原因的话应该是这个基镜像中缺少一些基础环境dll,我尝试在里面安装vc_redist也不能解决,我认为这是最坑的地方。最后我采用了microsoft/windowsservercore,编译了一个基础的HelloWorld程序。

代码如下:

#include"stdafx.h"
#include<iostream>

int main()
{
    std::cout<<"Hello LMW"<<std::endl;
    int k;
    std::cin>>k;
    return 0;
}

并用VS2015编译输出了Hello.exe,这个时候虽然有了exe但是这基镜像中的环境中依然缺少一些环境库(可能是没有安装vc_redist吧),这个时候通过vs的dumpbin.exe程序来查看exe依赖的所有的dll,并把这些dll和exe一起copy到docker镜像中才行。使用dumpbin.exe的命令是:dumpbin.exe /DEPENDENTS Hello.exe(注意正确的路径)。在C:\Windows\System32中找到这些dll即可。

把exe和dll放到一个文件夹中,本文中放在了test文件下,并编写dockerfile

FROM microsoft/windowsservercore
COPY test C://test
WORKDIR c://test
CMD Hello.exe

构建docker:

docker build –t test .

即可完成docker的构建,运行docker:docker run test,即可看到输出“Hello LMW”。

至此docker中部署VC++程序就完成了,主要需要注意的是采用windowsservercore作为基镜像,并注意依赖的dll一定要完整。

后记:有朋友私信我问windows下docker相关的问题,这还真是不好讲,因为我写完这篇博客后,就放弃在windows下使用docker,转战linux了。

猜你喜欢

转载自blog.csdn.net/l491453302/article/details/80807861