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

news2024/9/26 1:18:09

参考:

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.coloradmin.cn/o/1323999.html

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

相关文章

vue proxy代理 和 Nginx 配置跨域

vue.config.js文件中配置的代理: devServer: {port: 9095,// open: true, // 配置项目在启动时自动在浏览器打开proxy: {/yh: { // /api是代理标识,一般是每个接口前的相同部分target: "http://192.168.5.58:8002", // 请求地址,一…

2023年12月GESP认证Scratch图形化等级考试(四级)真题试卷

2023年12月GESP认证Scratch图形化等级考试(四级)真题试卷 题目总数:27 总分数:100 选择题 第 1 题 单选题 现代计算机是指电子计算机,它所基于的是( )体系结构 A. 艾伦图灵 B. …

Kafka为什么能高效读写数据

1)Kafka 本身是分布式集群,可以采用分区技术,并行度高(生产消费方并行度高); 2)读数据采用稀疏索引,可以快速定位要消费的数据; 3)顺序写磁盘; …

vue3项目引入电子签名(可横屏竖屏)

实现效果:(左边横屏,右边竖屏) 前言:【使用开源项目smooth-signature 实现签名的功能。Gitee 地址是 :GitHub - linjc/smooth-signature: H5带笔锋手写签名,支持PC端和移动端,任何前…

局域网其他pc如何访问宿主机虚拟机IP?

文章目录 背景贝瑞蒲公英设置虚拟机网络连接测试 背景 使用贝瑞蒲公英异地组网,将家里的pc作为pgsql服务器在公司使用,但是虚拟机的ip和端口访问不了 贝瑞蒲公英 设置虚拟机网络 就是添加端口转发规则 连接测试 公网内其他pc连接测试 可以看到已经连接成…

【python基础】-- yarn add 添加依赖的各种类型

目录 1、安装 yarn 1.1 使用npm安装 1.2 查看版本 1.3 yarn 淘宝源配置 2、安装命令说明 2.1 yarn add(会更新package.json和yarn.lock) 2.2 yarn install 2.3 一些操作 2.3.1 发布包 2.3.2 移除一个包 2.3.3 更新一个依赖 2.3.4 运行脚本 …

知乎上高频提问:Redis到底是单线程还是多线程程序?

1.概述 这里我们先给出问题的全面回答:Redis到底是多线程还是单线程程序要看是针对哪个功能而言,对于核心业务功能部分(命令操作处理数据),Redis是单线程的,主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的&#xff…

Potplayer播放器远程访问群晖WebDav本地资源【内网穿透】

文章目录 本教程解决的问题是:按照本教程方法操作后,达到的效果是:1 使用环境要求:2 配置webdav3 测试局域网使用potplayer访问webdav3 内网穿透,映射至公网4 使用固定地址在potplayer访问webdav 国内流媒体平台的内容…

node.js mongoose aggregate

目录 官方文档 简述 Aggregate的原型方法 aggregate进行操作 官方文档 Mongoose v8.0.3: Aggregate 简述 在 Mongoose 中,Aggregate 是用于执行 MongoDB 聚合操作的类。MongoDB 聚合操作是一种强大的数据处理工具,可以用于对集合中的文档进行变换和…

智慧安防视频监控EasyCVR如何通过回调接口向第三方平台推送RTSP视频通道离线通知

安防视频监控系统EasyCVR能在局域网、公网、专网等复杂的网络环境中部署,可支持4G、5G、WiFi、有线等方式进行视频的接入与传输、处理和分发。平台能将接入的视频流进行汇聚、转码、多格式输出和分发,具体包括:RTMP、RTSP、HTTP-FLV、WebSock…

微信视频号本地生活服务商如何申请,最新方法来了

随着某平台的本地生活服务商被清退,大量的服务商开始想着如何转型,但辛苦一年打下来的商家资源,如何才能效果最大化?最好的方式就是重新找一个平台进行接盘。 随着视频号本地生活业务的开展,这一下就受到广大创业者&a…

linux运维面试题

linux运维面试题 面试 K8S篇(高可用) Q:k8s是什么?架构? Kubenetes是一个开源的容器集群管理系统。主要用于容器编排,解决容器调度问题。当应用请求时,k8s需要合理分配请求到空闲node节点上去。k8s使用的主从模式&…

《Linux C编程实战》笔记:进程操作之ID,优先级

获得进程ID getpid函数 这个函数都用了很多次了&#xff0c;看一下定义和例子就行了 #include<sys/types.h> #include <unistd.h> pid_t getpid(void); 示例程序1 #include<cstdlib> #include<malloc.h> #include<cstring> #include <cs…

中国社科院与新加坡新跃社科联合培养工商管理博士

全球经济正在经历由科技进步与创新、政治和人口的剧烈变化所带来的巨大不确定性与挑战。企业的领导者和管理者需要发展出战略性思维和全球洞察力以便面对越来越大的经济波动。中国社科院与新加坡新跃社科联合培养工商管理博士项目的训练能够让学生在一个企业和组织的改变和发展…

快速给SOLIDWORKS工程图添加水印

水印常见于电子文档或纸质上的文字或图案&#xff0c;日常生活中&#xff0c;一些特殊的水印只能在特定的条件下才能看到。水印可以作为一个品牌的象征&#xff0c;有的软件生成文档就会有水印&#xff0c;可以作为宣传&#xff0c;让更多的人熟知。 作品水印&#xff0c;就是…

app测试必掌握的核心测试:UI、功能测试!

一、UI测试 UI即User Interface (用户界面)的简称。UI 设计则是指对软件的人机交互、操作逻辑、界面美观的整体设计。好的UI设计不仅是让软件变得有个性有品味,还要让软件的操作变得舒适、简单、自由、充分体现软件的定位和特点。手机APP从启动界面开始, 到运行过程,直至退出,…

为什么要编写测试用例,测试用例写给谁看?

“为什么要编写测试用例&#xff0c;测试用例写给谁看”&#xff0c;这个问题看似简单&#xff0c;但却涵盖了一系列复杂的考虑因素&#xff0c;并不太好回答。 为了向各位学测试的同学们解释清楚“为什么编写测试用例是至关重要的”&#xff0c;我将通过以下5个方面进行展开&…

【工具使用-ADB】小米手机如何使用adb传输文件

一&#xff0c;简介 本文主要介绍&#xff0c;如何使用小米手机&#xff0c;打开adb设置进行文件的传输。供参考 二&#xff0c;操作步骤 2.1 进入开发者模式 “设置”->“我的设备”->“全部参数信息” 连续多次点击“MIUI 版本”&#xff0c;直到提示“您已处于开…

英码科技受邀参加2023计算产业生态大会,分享智慧轨道交通创新解决方案

12月13-14日&#xff0c;“凝心聚力&#xff0c;共赢计算新时代”——2023计算产业生态大会在北京香格里拉饭店成功举办。英码科技受邀参加行业数字化分论坛活动&#xff0c;市场总监李甘来先生现场发表了题为《AI哨兵&#xff0c;为铁路安全运营站好第一道岗》的精彩主题演讲&…

计算机网络 运输层上 | 运输层概述 UDP协议 端口 套接字

文章目录 1 运输层概述1.1 运输层存在的意义1.2 运输层协议概述1.3 主要端口号 2 运输层主要协议 UDP2.1 UDP的特点2.2 UDP首部格式2.3 UDP工作流 1 运输层概述 1.1 运输层存在的意义 之前我们讲网络层的时候&#xff0c;已经可以将信息从一个主机传递到另一个主机了。 那么…