4610f1b2fd3e256f5cc672301fd8946d.png

在上一篇文章 .NET与鲲鹏共展翅,昇腾九万里(一)中,我们通过在鲲鹏架构的Euler系统上跑Docker的方式把dotnet core 跑起来了,有读者反馈说“还是走docker喽,你这个标题应该改成鲲鹏和docker两条鲸鱼的故事”。这里要说明一下,dotnet core 在鲲鹏上的Euler系统里原生就能跑起来,使用docker只是为了简化应用环境配置以及隔离各种应用对操作系统的配置污染(比如修改环境变量,设定执行路径,变更各种配置)从而导致新的应用配置好后,原有应用可能挂掉的问题。在这里,我也简单的介绍一下在Euler系统下直接安装dotnet core SDK的方法。

1. 安装几个必备库

yum install zlib -yyum install libcurl -y

2. 下载 dotnet core sdk arm64 的包,这里以 3.1.201版本为例,其他版本地址可以去 dotnet core 官网获取

wget https://download.visualstudio.microsoft.com/download/pr/98a2e556-bedd-46c8-b3fa-96a9f1eb9556/09f60d50e3cbba0aa16d48ceec9dcb0b/dotnet-sdk-3.1.201-linux-arm64.tar.gz

3. 解压并安装 dotnet-sdk-3.1.201-linux-arm64.tar.gz,这里假定将sdk安装到 /usr/share/dotnet/

mkdir -p /usr/share/dotnet/tar zxf dotnet-sdk-3.1.201-linux-arm64.tar.gz -C /usr/share/dotnet/export DOTNET_ROOT=/usr/share/dotnet/export PATH=$PATH:/usr/share/dotnet/
好了,到这里dotnet core sdk就安装完成了,你可以输入dotnet –info验证一下。13fc3cc2a43391dd0c9bf194728c7fa2.png另外可以将最后两个2个export添加到 /etc/profile,这样每次登录都可以直接使用 dotnet 命令了。

现在接着上一篇文章的内容,我们看看如何使用.NET SDK 的 Docker镜像编译 .NET Core程序,并使用Docker将它跑起来。

一、使用Docker 镜像创建dotnet core 项目

1. 拉取dotnet core sdk 3.1的镜像

docker pull mcr.microsoft.com/dotnet/core/sdk:3.1

2. 新建一个dotnet core 项目

先在本地建一个目录

mkdir -p ~/dotnet/mvctest

现在执行如下命令,新建一个sdk镜像的容器,并进入交互界面,这里使用了 -v ~/dotnet/mvctest:/root/dotnet/mvctest 参数将外部的文件夹映射到容器内

docker run --rm -it \-v ~/dotnet/mvctest:/root/dotnet/mvctest \mcr.microsoft.com/dotnet/core/sdk:3.1 \bash

进入容器后执行

dotnet new mvc -n mvctest -o ~/dotnet/mvctest

6aadb4704dd44ee5f3fd9f569f803d26.png

这一步跟平时我们使用dotnet命令行没什么区别,这里就是利用 sdk镜像创建一个dotnet core 项目

输入exit退出容器,由于刚才使用 --rm 参数运行sdk镜像,退出后容器自动销毁。

看一下本机的~/dotnet/mvctest是否已经有内容了

ef45aa40a12e0b874b05fcb0984915ed.png

二、使用sdk镜像来编译这个新建的项目,并生成镜像

1. 在mvctest目录下新建一个Dockerfile,内容如下

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS buildWORKDIR /source# copy proj and restore as distinct layersCOPY . .RUN dotnet restoreRUN dotnet publish -c release -o /app --no-restore# create app imageFROM mcr.microsoft.com/dotnet/core/aspnet:3.1WORKDIR /appCOPY --from=build /app .ENTRYPOINT ["dotnet", "mvctest.dll"]

里面引用了2个镜像:

mcr.microsoft.com/dotnet/core/sdk:3.1 用于编译

mcr.microsoft.com/dotnet/core/aspnet:3.1 用于mvctest的基础镜像

2. 编译dotnet项目并生成mvctest镜像,如果本地已有最新的sdk及aspnet镜像,以下参数中的 --pull 可以省略加快编译速度

docker build --pull -t mvctest . -f Dockerfile

1968ff379c7eef7c3e0dc6bdaaa25e37.png

3. 看下生成的镜像

docker images
fc65f49465bad44f32701ec20d3c2eb0.png

4. 运行这个镜像

docker run --rm -it -p 80:80 mvctest

程序成功运行,输出如下

424a51d3d41e08129cb2fc431fff2cb1.png

浏览器打开地址展示如下

a7869014ae487fd95d81bd85ea96634b.png

正式使用可以去掉--rm -it两个参数,改成-d --restart=unless-stopped,这样程序将在后台运行,不会出现交互界面,当异常退出后,docker也能自动将其重新运行起来

docker run -d --restart=unless-stopped -p 80:80 mvctest

至此,dotnet core与鲲鹏架构及Euler系统相关的部分内容已经结束,所有在其他平台上正常运行的程序,基本上不需要修改即可在鲲鹏架构下的Euler系统上运行。这里提一点,由于鲲鹏是arm64架构的,有些dotnet包底层引用了c++编写的dll,比如System.Data.SQLite, 并且该nuget包里没有包含arm64的dll,如果你的使用了这样的包,在鲲鹏架构下将会报告找不到dll的错误,解决方法有2种,一种是自己去找到arm64使用的dll, 拷贝到项目中,另外一种就是换成其他支持arm64的包,比如System.Data.SQLite有个替代的由微软出品的 Microsoft.Data.Sqlite。当然了这种情况比较少,目前我所涉及的项目只有Sqlite掉坑里了。

f00753e8f675c0218b4ca1e6d45419e9.png

Logo

昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链

更多推荐