.NET与鲲鹏共展翅,昇腾九万里(二)

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

在这里,我也简单的介绍一下在Euler系统下直接安装dotnet core SDK的方法。

1. 安装几个必备库

yum install zlib -y
yum 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验证一下。

另外可以将最后两个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

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

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

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

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

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

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
WORKDIR /source# copy proj and restore as distinct layers
COPY . .
RUN dotnet restore
RUN dotnet publish -c release -o /app --no-restore# create app image
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY --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

3. 看下生成的镜像

docker images

4. 运行这个镜像

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

程序成功运行,输出如下

浏览器打开地址展示如下

正式使用可以去掉--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掉坑里了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310413.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Java基础]final和static修饰符

final: final修饰局部变量时: static: static访问特点:

优化委托的 DynamicInvoke

优化委托的 DynamicInvokeIntro委托方法里有一个 DynamicInvoke 的方法,可以在不清楚委托实际类型的情况下执行委托方法,但是用 DynamicInvoke 去执行的话会比直接用 Invoke 的方法会慢上很多,差了两个数量级,所以在知道委托类型的…

数据结构与算法-- 广度优先打印二叉树

广度优先打印二叉树 题目:从上往下打印出二叉树的每一个节点,同一层节点按照从左到右顺序打印,例如下图中二叉树,依次打印出是8,6,10,5,7,9,11 如上题中二叉树的节点定义我们用之前文章 二叉树实现原理中定义的节点结构。此处提议…

实现一个基于动态代理的 AOP

实现一个基于动态代理的 AOPIntro上次看基于动态代理的 AOP 框架实现,立了一个 Flag, 自己写一个简单的 AOP 实现示例,今天过来填坑了目前的实现是基于 Emit 来做的,后面有时间再写一个基于 Roslyn 来实现的示例效果演示演示代码&…

数据结构与算法-- 二叉树后续遍历序列校验

二叉树后续遍历序列校验 题目:输入一个整数数组,判断改数组是否是某个二叉搜索树的后续遍历结果,如果是返回true否则false,假设输入数组的任意两个数字不相同。 例如输入{5,7,6,9,11,10,8}则返回true,因为这个整数序列…

程序员过关斩将-- 工作好多年可能还未真正了解接口和抽象类

点击上方“蓝字”关注我们菜菜哥,我偷偷出去面试了,然后面试官让我回来等消息那你可能挂了呀,有什么问题没回答上来吗确实有一个问题回答的不太好哎,就是接口和抽象类这个确实是面试官比较爱问的题目之一那能不能说说接口和抽象类…

数据结构与索引-- mysql InnoDB存储引擎索引

索引与算法 索引是我们在应用开发过程中程序数据可开发的一个重要助力。也是一个重要的研究方向,索引太多,应用的性能可能受到影响,如果索引太少,对查询性能又会有制约。我们需要找到一个合适的平衡点,这个对性能至关…

扫盲消息队列 | 消息中间件 | Kafka

先吐槽我真的写技术文章写到怀疑人生,我翻看历史发文记录,只要我一本正经的写的技术文章,都没人看,但是!一发闲扯淡的内容,阅读量肯定是技术文的好几倍(读者爸爸们别这么搞嘛)这说明…

数据结构与索引-- B+树索引

B树索引 上一节中我们讨论的都是B树的数据结构的由来以及他的一些操作,B树索引在本质就是B树在数据库中的一个实现,但是B索引在数据库中有一个特点就是他的高扇出性,因此在数据库中,B树的高度一般是2~3层,也就是对于查…

7种方法帮助企业改进软件维护效率

前言为了更高效地维护软件,同时为新的软件开发创造尽可能多的时间,以下为你介绍一些企业采取的方法和步骤。2019年,Tiedlift,一个开源支持和维护的企业,对软件开发人员进行了一项调查,结果显示,…

数据结构与索引-- mySql索引诡异事件

什么时候使用B树索引 并不是所有查询条件下出现的列都需要添加索引。对于什么时候添加索引,我们通过经验判断,访问表中很少一部分行时候,使用B树索引才有意义。对于性别字段,地区字段,类型字段,他们取值范…

[Java基础]抽象类和接口的区别

抽象类和接口的区别:

async,await执行流看不懂?看完这篇以后再也不会了

昨天有朋友在公众号发消息说看不懂await,async执行流,其实看不懂太正常了,因为你没经过社会的毒打,没吃过牢饭就不知道自由有多重要,没生过病就不知道健康有多重要,没用过ContinueWith就不知道await,async有…

如何分析EFCore引发的内存泄漏

调查实体框架核心中的内存泄漏不要让内存泄漏成为洪水术语“内存泄漏”和“ .NET应用程序”不是经常一起使用。但是,我们最近在一个.NET Core Web应用程序中出现了一系列内存不足异常。事实证明,此问题是由Entity Framework Core中的行为更改引起的&…