.NET 6应用程序适配国产银河麒麟V10系统随记
最近想在麒麟系统上运行.NET 6程序,经过一番折腾最终完成了,简单记录一下。
目标系统:
- CPU: aarch64架构(ARM64)
- 操作系统:银河麒麟V10高级服务器系统
银河麒麟V10系统(以下简称麒麟)使用的是redhat类似的dnf包管理方式,但是无法安装epel
,因此很多软件无法直接包安装。
方案
- 直接在麒麟上安装dotnet,并运行dotnet程序
这种方式很直接,无奈dotnet不支持在ARM64架构下的包管理安装,只能使用snap
、安装脚本或者手动进行安装。然后snap
我在麒麟上发现也不好装,一直没有成功;安装脚本需要连接国外的服务器,我这联外网有点问题,死活是装不上;手动方式我觉得好麻烦,直接放弃吧。
- 通过docker的形式执行dotnet程序
这种方式兼容性强,只要对应依赖的组件有aarch64版本的docker镜像就可以用,dotnet是有的,麒麟也支持docker。
于是乎选择的使用docker进行部署,由于还需要部署数据库,选择使用docker-compose是更好的选择。只需要在系统中执行
dnf install docker docker-compose
系统即可安装好必要的docker组件。
要点记录
有关如何将在Docker上运行.NET 6程序,很多文章已经有写,官网也有很详细的说明,我就不重复了写了。
.NET程序参数传递
传统上.NET程序一般使用appsettings.json
进行参数的设置,在docker中,为了配置方便,更多使用环境变量进行参数的传递,默认.NET依赖注入的IConfiguration
就可以直接读取环境变量,但是对于手动的情况,需要指定AddEnvironmentVariables()
方法:
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true)
.AddEnvironmentVariables()
.Build();
如果需要设置如下参数:
"IdentityConfig": {
"server.urls": "http://*:5000", // 服务地址
}
那么在docker-compose设置中应当这么写:
environment:
# - ASPNETCORE_ENVIRONMENT=Docker
- IdentityConfig__server.urls=http://*:5000 #
冒号在yaml配置中应当替换为两个连续下划线“__”,dotnet读取配置的时候,依然可以使用config[IdentityConfig:server.urls]
获得参数。
Dockerfile设置
选择docker这种方式的话,需要从源代码编译.NET应用,因此在执行Dockerfile
的时候,会执行dotnet restore
之类的命令,强烈建议换成国内的nuget源,国外的还是慢了点。
国内的有:
- 华为云:https://repo.huaweicloud.com/repository/nuget/v3/index.json
- 腾讯云:https://mirrors.cloud.tencent.com/nuget
- 中国区Azure:https://nuget.cdn.azure.cn/v3/index.json
请在dotnet restore build publish添加--source https://nuget.cdn.azure.cn/v3/index.json
指定使用固定的源进行编译。
EMQ X设备用户名与密码登录
最为非常流行的mqtt服务器,emqx也提供了docker的安装方式。这里需要说一下,现在很多mqtt设备只能支持固定的用户名和密码登录,因此启动docker的时候,需要通过文件指定(在EMQX 4.4上测试通过)。
volumes:
- ./emqx/emqx_auth_mnesia.conf:/opt/emqx/etc/plugins/emqx_auth_mnesia.conf
文件内容很简单:
## Password hash.
##
## Value: plain | md5 | sha | sha256 | sha512
auth.mnesia.password_hash = plain
##--------------------------------------------------------------------
## ClientId Authentication
##--------------------------------------------------------------------
## Examples
##auth.client.1.clientid = id
##auth.client.1.password = passwd
##--------------------------------------------------------------------
## Username Authentication
##--------------------------------------------------------------------
## Examples:
auth.user.1.username = test
auth.user.1.password = test
##auth.user.2.username = feng@emqtt.io
##auth.user.2.password = public
postgesql数据库文件配置
由于对docker的volume机制不是很熟悉,即便指定了文件夹映射(./postgres_data:/var/lib/postgresql/data
),新建了数据库之后,工作虽然一切正常,但是宿主文件夹内部没有任何东西,每次docker-compose down删除了容器后,数据消失的一干二净。最后按照文档的对数据存储的推荐方式,指定了PGDATA
最后得以解决。
volumes:
- ./postgres_data:/var/lib/postgresql/data/pgdata
environment:
POSTGRES_PASSWORD: "123456"
PGDATA: "/var/lib/postgresql/data/pgdata"
关于docker volume一些行为没太摸清楚,现在感觉是如果指定一个空文件夹映射,只有在容器内新生成的文件才能出现的宿主中,以后有机会在研究吧。
VNC设置
一直比较习惯使用xrdp,通过windows自带的远程桌面访问linux,不过麒麟系统dnf里面并没有这个包。只能用VNC了。大体步骤和[这篇文章](https://blog.csdn.net/qq_28903377/article/details/116565345写的一样,只要给麒麟安装上server并配置启动就好了,我稍微简化了一下,因为dnf源里面自带了tightvnc-server
,不需要手动下载了,直接
dnf install tightvnc-server
客户端只要安装tightvnc-viewer就可以了。
docker-compose
- 按照docker官方的说法,执行docker-compose up -d的时候,会自动加载docker-compose.yml以及docker-compose.override.yml两个文件。如果使用-f参数指定其他名称的文件时,比如:docker-compose-linux.yml,请注意,docker不会自动加载docker-compose-linux.override.yml文件。
- docker-compose对同一个网络内的服务设置了服务名称的主机名解析,因此需要在服务之间相互访问(常见于反向代理)时,不应该使用IP,而应该使用服务名称替代。
- docker-compose内可以指定
healthcheck
进行服务的健康检查,如果对启动顺序要求比较高的话,建议加上,如何对.NET 6程序进行健康检查,官方有一个文档,但是一些步骤不是很清楚,以后有机会单独写一篇。 - 停止docker-compose运行的服务时,不要使用docker-compose down,这个命令会删除所有的容器,容器产生的信息在没有正确使用volumes的情况下会丢失,建议使用docker-compose stop替代。
- docker-compose.yml中,需要谨慎设置build节中的context与dockerfile,参考Dockerfile确定它的当前目录是什么设置context。
- 成功编译并且运行docker-compose后,可以删除.NET项目源代码并删除docker-compose.yml中的build设置,只要不删除image,容器依然可以正常启动。
总结
aarch64上的国产银河麒麟v10系统,已经有很多软件可用了(redis、pg等),可能还有一些软件无法适配(只支持x64平台的),但是对于.NET程序来说,由于runtime已经完全支持aarch64,绝大部分应用可以正常运行。
本文使用docker-compose在linux与windows(windows desktop wsl2)上都测试.NET 6通过。
.NET 6应用程序适配国产银河麒麟V10系统随记的更多相关文章
- 国产银河麒麟 安装wps 的简单方法
前提说明 银河麒麟 是总部在天津的企业 有国防科大还有 ubuntu的母公司一起在维护 主要的产品有 优麒麟 还有 银河麒麟 优麒麟 可以看做是 国产版的ubuntu的社区版 银河麒麟 则是 面向国内 ...
- 银河麒麟V10安装ASP.NET Core并配置Supervisor让网站开机自动运行
银河麒麟高级服务器操作系统V10是针对企业级关键业务,适应虚拟化.云计算.大数据.工业互联网时代对主机系统可靠性.安全性.性能.扩展性和实时性的需求,依据CMMI 5级标准研制的提供内生安全.云原生支 ...
- ubuntukylin16.04LTS(乌班图麒麟版长期支持版,并非银河麒麟)安装体验
最近,国产银河麒麟版在政府部门推广使用.我有幸接触了,感觉还是不错的.这次政府软件正版化整改中,也列入了windows和银河麒麟的选项.我想试安装一下,可是没找到.就近找了它的类似系统ubuntuky ...
- C# 搞桌面UI适配国产麒麟Linux+龙芯遇到的一些坑
由于一些国企有国产化的需求,所以搞了C#适配银河麒麟,适配了X64和龙芯MIPS版本 1. 在银河麒麟的龙芯版本中 pipe2 不能使用,x64版本上却可以用. pipe2 用来做自定义消息的,搞U ...
- [转帖]银河麒麟Kydroid 2.0全新发布:原生支持海量安卓APP
银河麒麟Kydroid 2.0全新发布:原生支持海量安卓APP https://news.cnblogs.com/n/652299/将手机操作系统 转移到 桌面 跟chromebook 类似的策略吧 ...
- 国产化之虚拟ARM64-CPU安装银河麒麟操作系统
背景 某个项目需要实现基础软件全部国产化,其中操作系统指定银河麒麟v4,CPU使用飞腾处理器.我本地没有这个国产的处理器,但飞腾是基于ARMv8架构的64位处理器,所以理论上基于这个CPU架构的硬件应 ...
- 国产化之银河麒麟安装达梦数据库DM8
背景 某个项目需要实现基础软件全部国产化,其中操作系统指定银河麒麟,数据库使用DM8. 虽然在之前的文章中已经成功模拟国产飞腾处理器,但是运行效率不高,所以这里的银河麒麟操作系统还是运行在x64平台上 ...
- 国产化之银河麒麟安装.NetCore-包管理器方式
背景 某个项目需要实现基础软件全部国产化,其中操作系统指定银河麒麟,数据库使用达梦V8,CPU平台的范围包括x64.龙芯.飞腾.鲲鹏等. 考虑到这些基础产品对.NETCore的支持,最终选择了3.1版 ...
- 国产化之银河麒麟.netcore3.1访问https服务的两个问题
背景 某个项目需要实现基础软件全部国产化,其中操作系统指定银河麒麟,数据库使用达梦V8,CPU平台的范围包括x64.龙芯.飞腾.鲲鹏等. 考虑到这些基础产品对.NETCore的支持,最终选择了3.1版 ...
随机推荐
- DML数据操作语言
DML数据操作语言 用来对数据库中表的数据记录进行更新.(增删改) 插入insert -- insert into 表(列名1,列名2,列名3...) values (值1,值2,值3...):向表中 ...
- HashMap 中的 hash 函数
1. 什么是 hash 函数 hash 函数,即散列函数,或叫哈希函数.它可以将不定长的输入,通过散列算法转换成一个定长的输出,这个输出就是散列值.需要注意的是,不同的输入通过散列函数,也可能会得到同 ...
- SQL年龄计算方法
第一种方法: 用DATEDIFF函数,DATEDIFF(YEAR,beginDate,endDate). 测试语句: 1 DECLARE @birthdayDate DATE 2 DECLARE @e ...
- 跨域问题和使用 cookie 的限制
前言 在我的文章 使用 cookie 的身份验证和授权 的最后,讲到了跨域问题,这篇文章就简单介绍跨域的相关知识,并说明在 net core 中怎么设置跨域. 使用的版本为 net6,并使用 Mini ...
- 为什么我在css里使用功能类优先
前言 我想在我们开始的学CSS语法的时候,都是从以下的流程开始的: 1.写一个CSS类选择器: .my-class { } 2.往选择器里填充CSS语法: .my-class { display fl ...
- torch.tensor(),torch.Tensor()
Pytorch tensor操作 https://www.cnblogs.com/jeshy/p/11366269.html 我们需要明确一下,torch.Tensor()是python类,更明 ...
- 技术分享 | app自动化测试(Android)--App 控件定位
原文链接 客户端的页面通过 XML 来实现 UI 的布局,页面的 UI 布局作为一个树形结构,而树叶被定义为节点.这里的节点也就对应了要定位的元素,节点的上级节点,定义了元素的布局结构.在 XML 布 ...
- 开发工具-Redis Desktop Manager下载地址
更新记录 2022年6月10日 完善标题. 官方: https://github.com/uglide/RedisDesktopManager 免费打包版: https://github.com/le ...
- Python基础学习_03
程序的流程控制 1.程序的组织结构 (1)顺序结构 (2)选择结构 (3)循环结构 2.对象的布尔值 以下对象的布尔值为False False,数值0,None,空字符串,空列表,空元组,空字典,空集 ...
- React技巧之发出http请求
原文链接:https://bobbyhadz.com/blog/react-send-request-on-click 作者:Borislav Hadzhiev 正文从这开始~ 总览 在React中, ...