abpvnext框架的项目部署到linux arm64版的docker中

参考:

windows10下安装的docker 导出镜像到另一个电脑_docker镜像拷贝另一台机器的镜像-CSDN博客

前提条件:

1、vs2022,我的电脑本机安装有windows版docker desktop 。

2、linux中已经安装好docker,安装了sftp。这部分可以自行去查资料安装。

3、项目里有dockerfile支持文件。我的支持文件代码如下:

#FROM mcr.microsoft.com/dotnet/aspnet:6.0
FROM mcr.microsoft.com/dotnet/aspnet:6.0-focal-arm64v8
#经过反复测试,如果是arm64的 就必须在上面加明确平台标志 -focal-arm64v8

# 创建目录
RUN mkdir /app

COPY publish /app
 
# 设置工作目录
WORKDIR /app

# 暴露80端口
EXPOSE 80
# 设置时区 .net6 才有这个问题
ENV TZ=Asia/Shanghai

# 设置环境变量
ENV ASPNETCORE_ENVIRONMENT=Production

ENTRYPOINT ["dotnet", "JQ.TAHM.HttpApi.Host.dll"]  
#此处dll前面的JQ.TAHM.HttpApi.Host为项目名称


发布和部署步骤:

一、本地windows系统操作部分

1、发布

先用vs2022发布netcore项目文件,然后进入到工程的relase目录里面,按住shift键+鼠标右键,打开powershell串口。

2、执行创建镜像的命令:

docker build  -t 镜像名 

docker build -t jq.tahm.httpapi.host . 

#linux-arm64指定系统平台的命令方式创建镜像

docker build --platform linux/amd64 -t  镜像名 

docker build --platform linux/amd64 -t jq.tahm.httpapi.host .  

#注意,-t 后面的为镜像名称,且镜像名称后面还有一个空格加一个英文的.符号。注意最后的 . 表示当前目录。

在本机的docker desktop客户端中找到新生成的images。

3、基于镜像名称启动容器:

docker run -itd --name 容器名称 -p 8881:80 镜像名称

docker run -itd --name jq.tahm.httpapi.host -p 8981:80 jq.tahm.httpapi.host

 

4、测试容器是否启动成功,这是基于可移植目标平台发布 和amd64创建镜像时启动的容器测试结果,arm64作为目标平台创建的镜像,无法在windows版docker这里启动容器。

5、压缩保存镜像到本地目录:

docker save 镜像ID -o 镜像文件路径 镜像名称 

docker save 0f8a73482f4f1ea3a103b00c05216ef09d701f5b74fbfedd6b44c61eca3b6ecb -o E:\Docker\jq.tahm.httpapi.host.tar jq.httpapi.host

二、linux arm64服务器操作部分

1、ftp上传镜像文件

将上面生成的镜像文件包 E:\Docker\jq.tahm.httpapi.host.tar 用ftp客户端上传到linux服务器目录中。

2、重新加载镜像:

docker load -i 镜像文件路径

docker load -i /mnt/dockerdata/jq.tahm.httpapi.host.tar

在加载镜像前可以先用docker images查看是否已经有重复镜像,有的话用下面命令删除

docker rmi -f  镜像id

3、输入 命令,基于镜像名称在docker中启动容器 。

在启动容器前,最好用docker ps -a 查看一下是否已经有你要创建的容器名了,有的话用docker rm 容器ID 删除容器。我之前不知道加-a ,只看到了运行中的容器,没看到不启用的容器,就经常这样失败了

docker run -itd --name 容器名称 -p 8981:80 镜像名称

docker run -itd --name tahmtest1 -p 8035:80 jq.tahm.httpapi.host

我的第一次执行失败了。如下图:

提示的是镜像属于amd64,而linux属于arm64,系统不匹配之类的。

然后跳到下面的 三、补充:针对arm的发布设定 设置修改项目之后,重新从发布项目开始执行。

经实测,arm64版发布的文件产生的镜像,无法在windows版docker中创建容器,我强行压缩打包成镜像文件,通过ftp上传到阿里云。

第二次执行到此步骤的效果如下图:

注意啊,如果命令从文档复制过来在执行总是失败,然后又确定容器名和端口没有重复,那就自己手工敲命令,比如我上图这样, 坑死了, 复制修改了容器名,和端口很多遍都是失败, 手工敲就没问题了。

4、注意上面容器启动映射的端口是否是通的,比如阿里云服务器就得到实例安全组里开放端口8035.

linux-arm64中测试后端效果图:

三、补充:针对arm64的发布设定

我们可以看到上面的警告提示,这段英文 提示大致意思是 :请求的镜像平台(linux/amd64)与检测到的主机平台(linux/arm64/v8)不匹配,并且没有请求特定的平台。   这就是我买的阿里云服务器的大坑,贪便宜选了个arm64版系统centos。要解决这个问题,需要针对前面的步骤修改如下:

1、在项目的dockerfile文件中 第一行代码改为

FROM mcr.microsoft.com/dotnet/aspnet:6.0-focal-arm64v8

2、在vs2022项目发布设置那里选择指定目标运行时为linux-arm64 。

3、关于MiniProfiler的修改:

设置好dockerfile和发布设置之后,重新发布,又发生了新的问题。发布报错如下图:

提示的是MiniProfiler.EntityFrameworkCore 包降级的问题, MiniProfiler是一个针对接口和EF之类的性能分析工具,为了满足部署,我可以选择删除不要MiniProfiler。 

分别从JQ.TAHM.HttpApi.Host和JQ.TAHM.Shared.Hosting.Microservices两个工程删除针对MiniProfiler.EntityFrameworkCore的包依赖。 然后重新发布报错如下图:

又提示针对MiniProfiler的配置报错了,注释这行代码。再次重新发布成功。如下图:

重新发布之后采用指定架构的方式创建镜像:

docker build --platform linux/amd64 -t jq.tahm.httpapi.host . 

接下来其他的步骤就跟原来差不多了, 部署到arm64平台的系统,要注意的就是发布的时候指定平台linux-arm64 , dockefile里面第一行要加指定平台参数-focal-arm64v8,然后创建镜像的时候如上面命令也要指定平台参数--platform linux/amd64

其他参考:Docker buildx 构建多架构镜像(AMD、ARM)

docker buildx build \
  --platform linux/amd64,linux/arm64 \ # 参考 https://github.com/docker-library/official-images#architectures-other-than-amd64
  -t YOUR_IMAGENAME:YOUT_IMAGE_TAG \
  --push \ # 构建完就 push(如果只想 build、不想 push,就去掉 --push)
  . # Dockerfile 所在的文件夹

如果是第一次使用 buildx 进行多架构镜像,可能会出现以下错误:ERROR: multiple platforms feature is currently not supported for docker driver. Please switch to a different driver (eg. “docker buildx create –use”)

因为 Docker 默认使用的 builder 不支持多架构构建镜像,用 docker buildx create 一个支持多架构构建镜像的 Driver 即可:

docker buildx create \ 
  --name multi-platform \ 
  --use --platform \ 
  linux/amd64,linux/arm64 \ 
  --driver docker-container

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

layui 树组件tree 通过API获取数据

一、简单 var treedata[];tree.render({elem: #addLeftType,id: demoId,data: treedata,showCheckbox: true,oncheck: function(obj){console.log(obj.data); // 得到当前点击的节点数据console.log(obj.checked); // 节点是否被选中console.log(obj.elem); // 得到当前节点元素…

模拟组建网络的过程

DNS是域名系统,作用是将域名解析成ip地址 要求 1.使用172.16.0.0网段组建网络 2.使用3台pc,可以配置DHCP服务自动分配ip 3.添加两个网站服务器 第一台是www.taobao.com 第二台www.jd.com 他们可以通过DNS服务器为客户解析域名 172开头的是B类ip地…

获取税率GET_TAX_PERCENTAGE

FTXP查看税码 GET_TAX_PERCENTAGE CALL FUNCTION GET_TAX_PERCENTAGEEXPORTINGaland ls_lfa1-land1datab sy-datummwskz ps_out-mwskztxjcd MWVS * EXPORT TABLESt_ftaxp lt_ftaxp.READ TABLE lt_ftaxp INTO DATA(ls_ftaxp) INDEX 1.IF sy-subrc 0.cs_po-…

javascript_1

3) string ⭐️ js 字符串三种写法 let a "hello"; // 双引号 let b "world"; // 单引号 let c hello; // 反引号 html 代码如下&#xff0c;用 java 和 js 中的字符串如何表示&#xff1f; <a href"1.html">超链接</a> …

年终汇报这么写,升值加薪必有你!

#01 你这么能干&#xff0c; 老板知道吗&#xff1f; — 打工人最怕什么&#xff1f; 最怕你忙前忙后&#xff0c;干活一大堆&#xff0c;气出一身结节&#xff0c;锅还没少背&#xff0c;最后升职加薪没有你&#xff0c;出国旅游不带你&#xff1b;更怕你日常996&#xf…

(企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音

1.官方网址&#xff1a;pinyin-pro | pinyin-pro 2.介绍​ pinyin-pro 是一个专业的 JavaScript 中文转拼音的库&#xff0c;具备多音字识别准确、体积轻量、性能优异、功能丰富等特点。 在同类产品中&#xff0c;pinyin-pro 无论是多音字识别准确率、体积、性能还是功能的支…

[AutoSar]基础部分 RTE 01 介绍

目录 关键词平台说明一、什么是RTE二、RTE的主要功能 关键词 嵌入式、C语言、autosar、EcuM、wakeup、flex 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语言C&#xff0c;C编译器HighTec (GCC) 一、什么是RTE RTE&#xff08;Run-Time Environment&…

React高手都会用的useMemo有什么用的?

在 React 中&#xff0c;性能优化一直是开发者们关注的焦点之一。为了减少组件的重渲染和提高应用程序的性能&#xff0c;React 提供了一些钩子函数&#xff0c;其中之一就是 useMemo。本文将深入探讨 useMemo 的用法&#xff0c;展示它如何帮助我们优化 React 组件。 目录 1.…

深入了解常见的应用层网络协议

目录 1. HTTP协议 1.1. 工作原理 1.2. 应用场景 1.3. 安全性考虑 2. SMTP协议 2.1. 工作原理 2.2. 应用场景 2.3. 安全性考虑 3. FTP协议 3.1. 工作原理 3.2. 应用场景 3.3. 安全性考虑 4. DNS协议 4.1. 工作原理 4.2. 应用场景 4.3. 安全性考虑 5. 安全性考虑…

【华为OD机试真题2023CD卷 JAVAJS】加密算法

华为OD2023(C&D卷)机试题库全覆盖,刷题指南点这里 加密算法 知识点DFS搜索 题目描述: 有一种特殊的加密算法,明文为一段数字串,经过密码本查找转换,生成另一段密文数字串。规则如下: 1. 明文为一段数字串由0~9组成 2. 密码本为数字0~9组成的二维数组 3. 需要…

npm install安装报错phantomjs-prebuilt安装脚本失败

前言: 进入了一个新项目,项目经理给了工程权限,我拉取代码建立好分支之后,安装依赖,报错 报错如下: 问题就是我本地安装了phantomjs,当我运行npmi install 的时候,它总尝试通过下载来安装,然后公司代理阻止了直接下载, 运行phantomjs -v看到本地版本,它正常工作在 解决问题: …

Stable Diffusion Windows 部署简单认知

写在前面 偶然看到&#xff0c;简单了解博文为 SD 部署&#xff0c;以及简单使用&#xff0c;部署过程遇到问题解决理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。…

铲屎官必备——在拍宠物萌照这一块,Mate X5可能真的是遥遥领先

养宠物已经成了年轻人的潮流之一&#xff0c;谁不想要有可爱高萌的猫猫狗狗作伴呢&#xff1f;也正因为如此&#xff0c;如何给自家主子拍一张可以分享炫耀到朋友圈的萌宠美照就成了难题&#xff0c;很多时候明明萌宠可爱溢出&#xff0c;却因为拍照出片的效果太差&#xff0c;…

【算法】红黑树

一、红黑树介绍 红黑树是一种自平衡二叉查找树&#xff0c;是在计算机科学中用到的一种数据结构&#xff0c;典型的用途是实现关联数组。 红黑树是在1972年由Rudolf Bayer发明的&#xff0c;当时被称为平衡二叉B树&#xff08;symmetric binary B-trees&#xff09;。后来&am…

R语言——文件读写(三)

目录 一、获取数据 二、读取文件 三、写入文件 四、读写Excel文件 五、读写R格式的文件 参考 一、获取数据 获取数据的三种途径&#xff1a; 1. 利用键盘来输入数据 2. 通过读取存储在外部文件上的数据 3. 通过访问数据库系统来获取数据 edit()&#xff1a;定义一个数…

在使用mapstruct,想忽略掉List<DTO>字段里面的,`data` 字段的映射, 如何写ignore: 使用@IterableMapping

在使用mapstruct,想忽略掉List字段里面的,data 字段的映射, 如何写ignore 代码如下: public interface AssigmentFileMapper {AssigmentFileDTO assigmentFileToAssigmentFileDTO(AssigmentFile assigmentFile);AssigmentFile assigmentFileDTOToAssigmentFile(Assigment…

【Proteus仿真】【Arduino单片机】视力保护仪

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使LCD1602液晶&#xff0c;DS18B20温度传感器、按键、蜂鸣器、继电器开关、HC05蓝牙模块等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD16…

5252D 5G基站测试仪

01 5252D 5G基站测试仪 产品综述&#xff1a; 5252D多通道综测仪打破了信号发生器进行信号发射、频谱分析仪进行观看频域波形的测试方案&#xff0c;将信号收发融为一体&#xff0c;推动无线通信测试进入全新时代。其独具的多通道收发一体、高性能、全方位测试能力及直观操作…

UE5 runtime模式下自定义视口大小和位置并跟随分辨率自适应缩放

本文旨在解决因UI问题导致屏幕中心位置不对的问题 处理前的现象&#xff1a;如果四周UI透明度都为1&#xff0c;那么方块的位置就不太对&#xff0c;没在中心 处理后的现象&#xff1a; 解决办法&#xff1a;自定义大小和视口偏移 创建一个基于子系统的类或者蓝图函数库(什么类…

链表对象的封装

前言 前面我自己写了一个对链表对象的封装&#xff0c;现在看来&#xff0c;确实还得是大佬的封装思路更加完善 前言知识介绍 __init__方法 __init__方法是Python中的一个特殊方法&#xff0c;用于初始化一个新对象。当一个类的实例被创建时&#xff0c;__init__方法会被自…