虹软开发新得---容器化部署(docker/.net5/C#)避坑

325 阅读4分钟

自从容器(主要是docker)出现后,分布式部署迎来了一场不小的革命,开发运维人员终于可以不用为部署环境不一致问题扯皮,同时动态扩展也大大简化。Docker加上K8S后,更是争强对基于docker部署的分布式系统的“三高”(高可用,高可扩,高并发)。对于C#而言,.net core时代的到来,开始了拥抱跨平台,对于容器化技术,微软会迟到,但绝不会缺席。今天,我们也来体验一把利用.net core3.1 WebApi架构,将虹软人脸识别项目部署到docker容器中。本文基于虹软人脸识别SDK 3.0 Windows C++ / X64版本(SDK下载链接:ai.arcsoft.com.cn/ucenter/res…)作为讲解以及代码展示。

生产环境中,Linux服务器的数量远超Windows server,因此Linux系统才是docker的主战场,顺便提一句K8S目前也仅支持Linux运行。在Linux系统安装docker,根据Linux版本不同,可能有些差异,主要两种发行版安装参考如下(你可能需要科学上网): Ubuntu:www.runoob.com/docker/ubun… CentOS:www.runoob.com/docker/cent… 环境好了,可以干活了。下面我们开始撸代码,实例代码我去除so,dll文件以及AppId,Key配置后,放在了github上面(github.com/18628271760…)大家可以下载参考,添加去除内容后,就可以可以跑起来。

下面开始避坑提示:

1.无法加载错误:绝大多数小伙伴在Windows上开发,再部署到Linux上。因此经常直接把虹软SDK的2个dll格式文件上传到Linux服务器,导致启动docker时候失败。原因当然是Windows的动态链接库与Linux版本不兼容引发的。 避坑做法是:推荐将dll与so文件同时加载到项目,方便调试与部署。编写完成在本地测试的时候,选择dll格式的动态链接库,部署上传到Linux的时候只上传对应的so文件。 2.“28676(0x7004)”错误:官方SDK解释的很清楚,SDK_KEY和使用的SDK不匹配。开发者在虹软开发者中心创建一个项目后,会自动生成一个APP_ID。这个项目下,可以有N个版本的SDK,这些SDK共用一个APP_ID,但有自己独立的SDK_KEY(不同系统版本间肯定不一样!)。 避坑做法是:注意在开发和部署测试的时候,切换不同的key,与当前系统版本一致。同样不要忘记不同系统下的引用文件切换。(表扬下虹软开发,相同代数的Windows/Linux C++版本函数完全一致,省去了不少麻烦)。 在这里插入图片描述 在这里插入图片描述 3.(微软挖坑!)镜像缺少依赖(提示找不到libgdiplus组件):由于本实例基于.net core3.1版本,需要在DockerFile里面加入.net core3.1依赖镜像。早期笔者使用的是微软自带的.net core3.1镜像,结果发现部署完成后启动容器,出现依赖缺失问题。经过排查后发现,微软自带的.net core3.1镜像没有集成libgdiplus库(libgdiplus是一个Mono库,用于对非Windows操作系统提供GDI+兼容的API,libgdiplus是mono中的System.Drawing依赖的一个组件,用于显示web页面基本颜色等。可用于生成netcore验证码,处理图片等。关于libgdiplus的详细信息,请小伙伴参考:www.jianshu.com/p/f71f9e713…) 避坑做法是:引用第三方镜像( lonwern/aspnetcore-libgdiplus:3.1)可以解决此问题。(其在Github上的开源地址为:github.com/lonwern/asp…

4.无法找到相关引用:与Windows系统类似,Linux在查找动态链接文件so时,也有一定顺序,如下: (1) gcc 编译时指定的运行时库路径 -Wl,-rpath (2) 环境变量 LD_LIBRARY_PATH (3) ldconfig 缓存 /etc/ld.so.cache (4) 系统默认库位置 /lib以及/usr/lib 如果我们的so文件没有在上述位置,Linux 程序运行时自然查找不到,将会报错。 避坑做法是:建议在Linux系统中基于docker部署, libarcsoft_face.so 和libarcsoft_face_engine.so需要拷贝到/usr/lib/目录下,最为简单方便。

在这里插入图片描述 将程序集上传到Linux,打包成镜像文件。镜像打包参考: blog.csdn.net/xiaoxionglo… 打包成功后,利用docker images命令参看是否创建成功:

在这里插入图片描述 创建成功后,利用docker run命令启动容器实例。 没有错误,利用docker ps -a命令参看下结果: 在这里插入图片描述 打开swagger,测试: 在这里插入图片描述 在这里插入图片描述 总结,容器化的部署,简化了跨平台的部署,同时也减轻了运维压力。但对新手来说,可能会遇到很多“坑”。不过踩坑爬坑就是能力提升的过程,希望本期开发心得对小伙伴使用虹软容器化部署有个避坑参考。

了解更多人脸识别产品相关内容请到虹软视觉开放平台