关于在GitLab的CI/CD中用docker buildx本地化多架构打包dotnet应用的问题

关于在GitLab的CI/CD中用docker buildx本地化多架构打包dotnet应用的问题

  • 这是一个DevOps综合性问题
    • docker buildx多架构打包.NET应用的问题
      • 用QEMU模拟多架构环境打包

这是一个DevOps综合性问题

网络上的方案都是细分的领域,未见一个集成了GitLab+docker+dotnet的多架构DevOps方案。由此,才产生了这篇文章,来说一说,我在自动化持续交付的过程中遇到的问题,以及解决方案。

docker buildx多架构打包.NET应用的问题

关于多架构构建,可以参考使用Docker buildx 为 .NET 构建多平台镜像这篇博文。

用QEMU模拟多架构环境打包

我与他不同的是,我的客户环境是信创,服务器无法连接公网,需要本地化打包成.tar包,而不是pushDocker Hub上。

但由于客户服务器是arm64架构的CPU,我本地没有相同架构的机器,于是我尝试在公司的amd64架构服务器上用QEMU模拟arm64的docker环境来编译。

shell命令如下:

docker buildx build --platform linux/arm64 -t demo:v1.0.0-linux-arm64 -o type=docker,dest=demo-linux-arm64.tar -f src/Demo/Dockerfile .

Dockerfile如下:

FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /srcCOPY ["Demo/Demo.csproj", "Demo/Demo.csproj"]RUN dotnet restore "Demo.csproj" -r linux-arm64
COPY . .WORKDIR "/src/Demo"
RUN dotnet build "Demo.csproj" -r linux-arm64 --no-restore -c Release -o /app/buildFROM build AS publish
RUN dotnet publish "Demo.csproj" -r linux-arm64 --no-restore -c Release -o /app/publishFROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Demo.dll"]

RUN dotnet restore "Demo.csproj" -r linux-arm64还原时报错:

MSBUILD : error : This is an unhandled exception in MSBuild -- PLEASE UPVOTE AN EXISTING ISSUE OR FILE A NEW ONE AT https://aka.ms/msbuild/unhandled
MSBUILD : error :     System.NullReferenceException: Object reference not set to an instance of an object.

这个报错很明显是MSBUILD的错误,由于我程序在调试编译时是没问题的,所以想到应该是架构不同引发的问题。在网上查找一番,发现-a这个参数可以指定架构,于是改成了RUN dotnet restore "Demo.csproj" -a arm64

这次编译成功了,有点得意,拿去客户服务器部署,却还是报错Exec format error

此时查看docker镜像确实是arm64架构的。

说明,虽然编译成功,镜像也是arm64架构了,但MSBUILD生成的dll文件的格式还是amd64架构的。

这就犯难了,明明用了QEMU模拟arm64的docker环境,镜像也成功打包成了arm64架构的,那是dotnet与QEMU环境无法兼容?

于是,就查到了[Unhandled Exception]: System.NullReferenceException: Object reference not set to an instance of an object.。

注意到这句话:This is dotnet/runtime#78340 which is likely rooted to https://gitlab.com/qemu-project/qemu/-/issues/249.

从dotnet/runtime#78340页面中找到了相关内容:

QEMU不支持.NET
至此,通过模拟arm64架构环境来打包的方式以失败告终。

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

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

相关文章

翻译工具开发技术笔记:《老挝语翻译通》app支持语音识别翻译功能,怎么提高语音识别的准确度呢?

《老挝语翻译通》app是一款专为老挝语翻译设计的免费工具,支持文本翻译、老挝文OCR文字识别提取、文字转语音。这款工具以其技术优势和用户友好的界面,为用户提供了便捷的老挝语翻译体验。 技术特点 文本翻译:支持双语输入,提供精…

qt QListView详解

1、概述 QListView 是 Qt 框架中的一个视图类,用于展示模型中的数据。它基于 QAbstractItemView,支持多种视图模式,如列表视图(List View)、图标视图(Icon View)等。QListView 是模型/视图框架…

初识C++(上) -- C++的关键字、命名空间、缺省参数以及函数的重载

目录 一、C的关键字(C98) 二、命名空间 1、命名冲突 2、命名空间 2.1 命名空间的定义 (1). 命名空间定义的例子以及命名空间的嵌套: (2). 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中: 2…

MySQL_客户端工具建库.

前言: 通过前面的学习我们已经了解到什么是数据库,以及数据库是如何安装的,相信大家都已将数据库安装好了,让我们接下来开始新的学习吧!!! 1.MySQL客户端工具 1. MySQL Workbench MySQL :: D…

突破1200°C高温性能极限!北京科技大学用机器学习合成24种耐火高熵合金,室温延展性极佳

在工程应用中,如燃气轮机、核反应堆和航空推进系统,对具备优异高温机械性能的金属合金需求十分旺盛。由于材料熔点的固有限制,传统镍基 (Ni) 高温合金的耐温能力已接近极限。为满足开发高温结构材料的需求,耐火高熵合金 (RHEAs) 于…

leetcode21:合并两个有序列表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4]示例 2: 输入:l1 [], l2 [] 输出:[]示…

开源模型应用落地-glm模型小试-glm-4-9b-chat-vLLM集成(四)

一、前言 GLM-4是智谱AI团队于2024年1月16日发布的基座大模型,旨在自动理解和规划用户的复杂指令,并能调用网页浏览器。其功能包括数据分析、图表创建、PPT生成等,支持128K的上下文窗口,使其在长文本处理和精度召回方面表现优异&a…

K8S篇(基本介绍)

目录 一、什么是Kubernetes? 二、Kubernetes管理员认证(CKA) 1. 简介 2. 考试难易程度 3. 考试时长 4. 多少分及格 5. 考试费用 三、Kubernetes整体架构 Master Nodes 四、Kubernetes架构及和核心组件 五、Kubernetes各个组件及功…

关于路由笔记

路由 定义: 在计算机网络中,路由是将数据包从源节点传输到目标节点的过程。这个过程涉及到网络中的多个设备,如路由器、交换机等,其中路由器起着关键的决策作用。 工作原理示例: 假设你在一个公司的局域网内&#…

人工智能之人脸识别(人脸采集人脸识别)

文章目录 前言PySimpleGUI 库1-布局和窗口 前言 例如:随着人工智能的不断发展,本文主要介绍关于人工智能中GUI和PyMysql相应用。 本文采用代码+逻辑思路分析的方式有助于理解代码。 PySimpleGUI 库 PySimpleGUI 是一个用于简化 GUI 编程的…

如何找到养生生活视频素材?推荐几个优秀网站

今天,我们来聊一个实用的话题,那就是如何找到优质的养生视频素材。作为自媒体创作者,高质量的视频素材对内容制作至关重要。不论你是刚入行的新手,还是已经积累了一定粉丝的大V,找到合适的养生视频素材都能帮助你更好地…

旋转对称性,旋转矩阵的特征矢量也是T3矩阵的特征矢量

旋转对称性要求T3矩阵,在旋转后,特征矢量没发生改变,特征值大小也没变,即T3矩阵没有改变

美畅物联丨物联网通信新纪元:Cat.1与5G RedCap的差异化应用

​ 在物联网(IoT)迅猛发展的时代,通信标准对物联网设备的连接性、性能和适用性有着极为关键的作用。小编在《美畅物联丨Cat.1与NB-IoT:物联网设备的通信标准对比》中提到Cat.1与NB-IoT的对比区别,后来就有小伙伴问&…

OpenCV视觉分析之目标跟踪(12)找到局部的最大值函数meanShift()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在反向投影图像上找到一个对象。 meanShift 是一种用于图像处理和计算机视觉领域的算法,特别适用于目标跟踪、图像分割等任务。该算…

应急救援无人车:用科技守护安全!

一、核心功能 快速进入危险区域: 救援无人车能够迅速进入地震、火灾、洪水等自然灾害或重大事故的现场,这些区域往往对人类救援人员构成极大威胁。 通过自主导航和环境感知技术,无人车能够避开危险区域,确保自身安全的同时&…

安装acondana3, Conda command not found

Linux 服务器安装acondana3后 输入conda找不到 写入路径也没找到 vim ~/.bashrc 加入 PATH"root/anaconda3/bin:$PATH" 更新文件: source ~/.bashrc 还是找不到conda 命令 解决办法 source ~/anaconda3/etc/profile.d/conda.sh conda activate Your_e…

第07章 运算符的使用

一、算数运算符 算术运算符主要用于数学运算,其可以连接运算符前后的两个数值或表达式,对数值或表达式进行加 ()、减(-)、乘(*)、除(/)和取模(%&a…

6堆(超级重点)

堆(Heap)的核心概述 堆针对一个 JVM 进程来说是唯一的,也就是一个进程只有一个 JVM,但是进程包含多个线程,他们是共享同一堆空间的。 6.1.1. 堆内存细分 Java 7 及之前堆内存逻辑上分为三部分:新生区养老…

Google Guava 发布订阅模式/生产消费者模式 使用详情

目录 Guava 介绍 应用场景举例 1. 引入 Maven 依赖 2. 自定义 Event 事件类 3. 定义 EventListener 事件订阅者 4. 定义 EventBus 事件总线 5. 定义 Controller 进行测试 Guava 介绍 Guava 是一组来自 Google 的核心 Java 库,里面包括新的集合 类型&#xff08…

全面解析:网络协议及其应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 # 全面解析:网络协议及其应用 文章目录 网络协议概述定义发展历程主要优势 主要网络协议应用层协议传输层协议网络层…