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

news/2024/5/19 20:57:12 标签: .netcore, 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.niftyadmin.cn/n/5277915.html

相关文章

缓存:系统设计中至关重要的一环

什么是缓存? 缓存就像是一个超快速的存储区域,保存了计算机或手机经常使用的内容的副本,这样可以在不访问较慢的主存储器的情况下快速获取。 一个现实中的例子可以是,每当我们购买杂货时,通常会倾向于大量购买&#…

计算机组成原理综合3

41、计算机操作的最小时间单位是__________。A A. 时钟周期 B. 指令周期 C. CPU周期 D. 外围设备 42、微程序控制器中,机器指令与微指令的关系是__________。B A. 每一条机器指令由一条微指令来执行 B. 每一条机器指令由一段用微指令编成…

飞书+ChatGPT搭建智能AI助手,无公网ip实现公网访问飞书聊天界面

飞书ChatGPT搭建智能AI助手,无公网ip实现公网访问飞书聊天界面 前言环境列表1.飞书设置2.克隆feishu-chatgpt项目3.配置config.yaml文件4.运行feishu-chatgpt项目5.安装cpolar内网穿透6.固定公网地址7.机器人权限配置8.创建版本9.创建测试企业10. 机器人测试 前言 …

3DES加解密

public static void main(String[] args) throws Exception {String content "";String plainText "";String key "";//加密byte[] encryptedBytes encrypt(plainText, key);String encryptedText Base64.getEncoder().encodeToString(encr…

Go项目快速集成Swagger UI

swag Swag将Go的注释转换为Swagger2.0文档。我们为流行的 Go Web Framework 创建了各种插件,这样可以与现有Go项目快速集成(使用Swagger UI)。 目录 快速开始支持的Web框架如何与Gin集成格式化说明开发现状声明式注释格式 通用API信息API操…

Python开发GUI常用库PyQt6和PySide6介绍之二:设计师(Designer)

Python开发GUI常用库PyQt6和PySide6介绍之二:设计师(Designer) PySide6和PyQt6都有自己的设计师(Designer),用于可视化地设计和布局GUI应用程序的界面。这些设计师提供了丰富的工具和功能,使开…

分享一个项目——Sambert UI 声音克隆

文章目录 前言一、运行ipynb二、数据标注三、训练四、生成总结 前言 原教程视频 项目链接 运行一个ipynb,就可操作 总共四步 1)运行ipynb 2)数据标注 3)训练 4)生成 一、运行ipynb 等运行完毕后,获得该…

虚拟机的下载、安装

下载 vmware workstation(收费的虚拟机) 下载vbox 网址:Oracle VM VirtualBox(免费的虚拟机) 以下选择一个下载即可,建议下载vbox,因为是免费的。安装的时候默认下一步即可(路径最好…