当前位置: 首页 > news >正文

Docker多架构镜像构建踩坑记

背景

公司为了做信创项目的亮点,需要将现有的一套在X86上运行的应用系统迁移到ARM服务器上运行,整个项目通过后端Java,前端VUEJS开发通过CICD做成Docker镜像在K8S里面运行。但是当前的CICD产品不支持ARM的镜像构建,于是只能手工构建ARM镜像。以下是一些踩坑的记录,希望能帮大家少踩坑

构建环境

  • 本地电脑 Deepin Linux 23 (Windows的WSL和其他的Linux系统都可以),X86_64架构
  • Docker镜像的本地代理,使用v2ray启的socks5://10.32.4.150:10808
  • 自建的Harbor仓库,地址: harbor.wldc.site

目标

通过本地制作一个双架构的应用运行基础镜像,并推送到harbor仓库中

步骤

  1. 在本地电脑上安装docker-ce,我是Deepin的系统可以直接运行以下命令安装,其它的系统安装方式,大家百度以下。
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list
#提示: 如果 $(lsb_release -cs) 返回的不是 buster 或 bullseye,可以手动替换为 buster 或 bullseye,这里我是替换了的
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian bullseye stable" | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker
  1. 配置docker,由于国内的环境,docker的使用目前非常的不友好,就是这个代理就踩了非常多的坑,还有就是https,http,证书受信等各种坑,都踩过了。这里一次性把docker的配置都贴了,也不知道是那个配置文件解决的问题。为了避免浪费时间,建议大家抄配置。
    /etc/docker/daemon.json
#以下文件10.32.4.150是本地电脑的IP地址,运行的socks5代理
{"insecure-registries": ["10.159.16.19","harbor.wldc.site"],"proxies": {"http-proxy": "socks5://10.32.4.150:10808","https-proxy": "socks5://10.32.4.150:10808","no-proxy": "11.0.0.0/8,10.0.0.0/8,.example.org,127.0.0.0/8,.cn-southwest-2.myhuaweicloud.com,10.159.16.19,.wldc.site"}}

/etc/systemd/system/docker.service.d/http-proxy.conf

[Service]
Environment="HTTP_PROXY=socks5://10.32.4.150:10808"
Environment="HTTPS_PROXY=socks5://10.32.4.150:10808"
Environment="NO_PROXY=localhost,127.0.0.1,.wldc.site"

~/.docker/config.json

{"auths": {"harbor.wldc.site": {"auth": "YWRtaW46TUxYWFVSS1lncVdrdjdrbQ=="},"https://index.docker.io/v1/": {"auth": "a2V2aW5ua********A2MzkxOQ=="}},
"proxies": {"default": {"httpProxy": "http://10.32.4.150:10808","httpsProxy": "http://10.32.4.150:10808","noProxy": "localhost,127.0.0.1,.wldc.site"}
}
}

上面3个文件配置完成以后,重启docker服务

systemctl daemon-reload && systemctl restart docker
  1. 创建docker的多架构builder,默认的builder只支持和宿主机一样的架构镜像,高版本的docker(>=19)默认也安装了buildx的插件。
#创建命令
docker buildx create --use --bootstrap --name multiarch \--platform linux/amd64,linux/arm64 \--buildkitd-flags '--allow-insecure-entitlement network.host' \--buildkitd-config ./buildkitd.toml \--driver docker-container \--driver-opt image=buildkit:buildx-stable-2 \--driver-opt env.HTTP_PROXY=socks5://10.32.4.150:10808 \--driver-opt env.HTTPS_PROXY=socks5://10.32.4.150:10808 \--driver-opt env.NO_PROXY=.wldc.site \--driver-opt env.http_proxy=socks5://10.32.4.150:10808 \--driver-opt env.https_proxy=socks5://10.32.4.150:10808 \--driver-opt env.no_proxy=.wldc.site 

以上的命令说明:

* --buildkitd-flags,这个参数影响非https的harbor的镜像推送
* --buildkitd-config ,这个参数是多架构构建builder的配置文件,详细的配置可以参考https://github.com/moby/buildkit/blob/master/docs/buildkitd.toml.md ,我就配置了一个镜像仓库非https,不然推送镜像的时候要报错
* --driver ,这个参数和后面的--driver-opt联合,主要是解决镜像代理拉去以及非https的问题
* --driver-opt image=buildkit:buildx-stable-2 ,这个是使用的builder的镜像,这个参数如果不添加,默认使用的moby/buildkit:buildx-stable-1,并且从dockerhub上面去拉。如果本地网络不通,就拉不了镜像,或者要做定制化,就手动本地打包一下镜像。

buildkitd.toml 文件内容

insecure-entitlements = [ "harbor.wldc.site", "10.159.16.19" ]
[registry."harbor.wldc.site"]http = trueinsecure = true
  1. 确认多架构的builder运行成功
#命令 docker buildx ls
NAME/NODE        DRIVER/ENDPOINT                   STATUS    BUILDKIT   PLATFORMS
multiarch*       docker-container                                       \_ multiarch0    \_ unix:///var/run/docker.sock   running   v0.18.1    linux/amd64*, linux/arm64*, linux/amd64/v2, linux/amd64/v3, linux/386
default          docker                                                 \_ default       \_ default                       running   v0.16.0    linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/386
  1. 通过Dockerfile构建多架构镜像,并推送到自建的harbor里面
export BUILDKIT_NO_CLIENT_TOKEN=1 #这个必须要运行,不然builder会去连接docker的auth服务,这个坑花了我很多时间。最后在这里找到了:https://forums.docker.com/t/docker-build-fails-while-docker-pull-works-as-expected/144116/5
docker buildx build  --platform=linux/amd64,linux/arm64  \
--network host \
--add-host harbor.wldc.site:10.159.16.19 \
--build-arg HTTP_PROXY=socks5://10.32.4.150:10808  \
--build-arg HTTPS_PROXY=socks5://10.32.4.150:10808  \
--build-arg NO_PROXY=localhost,127.0.0.1,.wldc.site  \
--build-arg http_proxy=socks5://10.32.4.150:10808  \
--build-arg https_proxy=socks5://10.32.4.150:10808  \
--build-arg no_proxy=localhost,127.0.0.1,.wldc.site  \
--push  -t harbor.wldc.site/base/openeuler:22.03-lts-sp4 .

画重点
如果harbor是用的域名访问,需要把这个域名写入到运行的builder的容器里面,宿主机配置了host不管用,–add-host 参数也不管用,如果大家发现了有其它的方法请留言给我,谢谢。以下是部署

root@KevinLiu-PC:/tmp# docker ps
CONTAINER ID   IMAGE                      COMMAND                   CREATED             STATUS             PORTS     NAMES
9b774b15a81f   buildkit:buildx-stable-2   "buildkitd --config …"   About an hour ago   Up About an hour             buildx_buildkit_multiarch0
root@KevinLiu-PC:/tmp# docker exec -it  9b774b15a81f sh
/ # cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2      9b774b15a81f
10.159.16.19 harbor.wldc.site
/ # 
  1. 登录harbor检测推送的多架构的镜像
    在这里插入图片描述

总结

在多架构构建的过程中遇到了很多问题,都于网络有关,目前国内的情况就是这样,没有办法。同时多架构的镜像构建,对于Dockerfile也有要求,针对Java这种语言,已经有JVM做了跨平台,编译出来的制品可以直接跨平台;但是如果是golang的应用,在编译和Dockerfile的时候都要独立处理。比如如下的Dockerfile,最后希望大家少踩坑。

# 第一步:构建阶段,在构建的时候buildx会同时拉两种架构的镜像
FROM  golang:1.18-alpine AS builder
# 设置环境变量
ENV CGO_ENABLED=0 \GOOS=linux \GO111MODULE=on
# 声明用于判断架构的参数
ARG TARGETARCH
# 工作目录
WORKDIR /app
# 拷贝源代码
COPY . .
# 下载依赖
RUN go mod tidy
# 针对不同架构执行操作,如果有特殊处理,可以在这个判断里面事项。当然如果Dockerfile具有通用性,可以不做判断
RUN if [ "$TARGETARCH" = "amd64" ]; then \echo "Building for amd64..."; \elif [ "$TARGETARCH" = "arm64" ]; then \echo "Building for arm64..."; \fi# 构建应用,不同的镜像打出来的二进制文件不一样
go build -o main .
# 第二步:运行阶段
FROM alpine:latest
# 安装时区数据和证书
RUN apk add --no-cache ca-certificates tzdata
# 设置工作目录
WORKDIR /root/
# 从构建阶段复制可执行文件
COPY --from=builder /app/main .
# 暴露端口(可选)
EXPOSE 8080
# 启动容器
CMD ["./main"]
#构建命令示例
docker buildx build --platform linux/amd64,linux/arm64 -t harbor.wldc.site/dev/demo:v1.0.0 -f Dockerfile .

相关文章:

Docker多架构镜像构建踩坑记

背景 公司为了做信创项目的亮点,需要将现有的一套在X86上运行的应用系统迁移到ARM服务器上运行,整个项目通过后端Java,前端VUEJS开发通过CICD做成Docker镜像在K8S里面运行。但是当前的CICD产品不支持ARM的镜像构建,于是只能手工构…...

“pinn是无网格的”???

“pinn是无网格的”??? PINN,即物理信息神经网络(Physics-Informed Neural Networks),是一种将物理定律作为先验知识整合到神经网络训练过程中的方法。它之所以被称为“无网格”的,…...

换一个ip地址是什么意思?换一个网络ip地址会变吗

在网络的世界里,IP地址如同每台设备的“身份证”,是确保网络信息能够准确传输到指定目标的关键。然而,在某些情况下,我们可能需要更换这个“身份证”,也就是更换IP地址。那么,换一个IP地址究竟是什么意思&a…...

JavaWeb学习--cookie和session,实现登录的记住我和验证码功能

目录 (一)Cookie概述 1.什么叫Cookie 2.Cookie规范 3.Cookie的覆盖 4.cookie的最大存活时间 ​​​​​​(Cookie的生命) (二) Cookie的API 1.创建Cookie:new 构造方法 2.保存到客户端浏…...

深度学习:基于MindSpore的极简风大模型微调

什么是PEFT?What is PEFT? PEFT(Parameter Efficient Fine-Tuning)是一系列让大规模预训练模型高效适应于新任务或新数据集的技术。 PEFT在保持大部分模型权重冻结,只修改或添加一小部份参数。这种方法极大得减少了计算量和存储开销&#x…...

【LeetCode力扣热题100】【LeetCode 1】两数之和

方法一&#xff1a;暴力循环 两层循环&#xff0c;遍历所有的组合&#xff0c;直到满足条件&#xff0c;返回结果。 class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {for(int i0; i<nums.size()-1 ;i){for(int j i1; j<…...

定制链接类名,两类跳转传参,vue路由重定向,404,模式设置

router-link-exact-active 和 router -link-active两个类名都太长&#xff0c;可以在router路由对象中定制进行简化 // index.js// 路由的使用步骤 52 // 1.下载 v3.6.5 // 2.引入 // 3.安装注册Vue.use(Vue插件) // 4.创建路由对象 // 5.注入到new Vue中&#xff0c;建立关联…...

【ArcGIS微课1000例】0135:自动生成标识码(长度不变,前面自动加0)

文章目录 一、加载实验数据二、BSM计算方法一、加载实验数据 加载专栏《ArcGIS微课实验1000例(附数据)》配套数据中0135.rar中的建筑物数据,如下图所示: 打开属性表,BSM为数据库中要求的字段:以TD_T 1066-2021《不动产登记数据库标准》为例: 计算出来的BSM如下图: 二、B…...

ISO45001职业健康安全管理体系认证流程

前期准备 领导决策&#xff1a;企业高层领导需认识到实施 ISO 45001 体系的重要性和必要性&#xff0c;做出认证决策&#xff0c;并承诺提供必要的资源支持。成立工作小组&#xff1a;由企业各相关部门人员组成工作小组&#xff0c;明确各成员的职责和分工&#xff0c;确保工作…...

VueRouter路由

单页应用程序:例 网易云 多页应用程序&#xff1a;例 京东 网易云导航栏点击任一网页不会跳转京东导航栏点击任一包括导航区域就会实现网页跳转 路由介绍 VueRouter Vue路由介绍 5个步骤写完之后出现 #/&#xff0c;说明当前Vue实例已经被路由所管理 2个关键步骤 新…...

性能测试攻略(一):需求分析

性能测试成为软件开发和运维过程中不可或缺的一环。性能测试不仅能够帮助我们了解系统在特定条件下的表现&#xff0c;还能帮助我们发现并解决潜在的性能问题。那么我们怎么做一次完整的性能测试呢&#xff1f;首先&#xff0c;我们需要进行需求分析&#xff0c;来明确我们的测…...

【24年新算法时间序列预测】黑翅鸢BKA优化Transformer时间序列预测(评估指标全,出图多)

本文采用黑翅鸢优化算法( BKA&#xff0c;2024年新算法)优化Transformer模型的超参数&#xff0c;形成了BKA-Transformer时间序列预测模型&#xff0c;以进一步提升其在时间序列预测中的性能&#xff0c;本文采用Matlab编写了BKA-Transformer时间序列预测模型代码&#xff0c;代…...

YOLOv8改进,YOLOv8引入CARAFE轻量级通用上采样算子,助力模型涨点

摘要 CARAFE模块的设计目的是在不增加计算复杂度的情况下,提升特征图的质量,特别是在视频超分辨率任务中,提升图像质量和细节。CARAFE结合了上下文感知机制和聚合特征的能力,通过动态的上下文注意力机制来提升细节恢复的效果。 理论介绍 传统的卷积操作通常依赖于局部区域…...

ZooKeeper节点扩容

新节点的准备工作&#xff08;这里由hadoop05节点&#xff0c;IP地址为192.168.46.131充当&#xff09; 配置新节点的主机域名映射&#xff0c;并将其通告给集群中的其他节点配置主机间免密登录关闭防火墙并将其加入到开机不启动项同步hadoop01节点的时间将所需要的文件分发给新…...

深度学习的unfold操作

unfold&#xff08;展开&#xff09;是深度学习框架中常见的数据操作。与我们熟悉的卷积类似&#xff0c;unfold也是使用一个特定大小的窗口和步长自左至右、自上至下滑动&#xff0c;不同的是&#xff0c;卷积是滑动后与核求乘积&#xff08;所以取名为卷积&#xff09;&#…...

C# 抽奖程序winform示例

C# 抽奖程序winform示例 using System; using System.Collections.Generic; using System.Linq;public class LotterySimulator {private Random random new Random();public List<string> GenerateWinners(int numberOfWinners, int totalParticipants){List<strin…...

嵌入式蓝桥杯学习9 usart串口

复制一下之前ADC的工程&#xff0c;打开cubemx cubemx配置 1.在Connectivity中点击USART1 Mode&#xff08;模式&#xff09;:Asynchronous&#xff08;异步模式&#xff09; 2.将PA9设置为USART1_TX&#xff0c;PA10设置为USART1_RX。 3.配置Parameter Settings. Baud R…...

车载ADB:让汽车更智能的桥梁

随着科技的不断进步&#xff0c;汽车行业也在迅速迈向智能化。车载Android系统&#xff08;通常称为Android Auto&#xff09;正在变得越来越流行&#xff0c;而Android Debug Bridge (ADB) 作为连接和调试这些系统的桥梁&#xff0c;也变得尤为重要。在本文中&#xff0c;我们…...

HarmonyOS-高级(一)

文章目录 一次开发、多端部署自由流转 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;HarmonyOS专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年12月09日12点19分 一次开发、多端部署 布局能力 自适应布局 拉伸能力均分能力占比能力缩放…...

【优选算法-滑动窗口】长度最小的子数组、无重复字符的最长子串、最大连续1的个数、将x减为0的最小操作数、水果成篮

一、长度最小的子数组 题目链接&#xff1a; 209. 长度最小的子数组 - 力扣&#xff08;LeetCode&#xff09; 题目介绍&#xff1a; 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, .…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

Vue 3 + WebSocket 实战:公司通知实时推送功能详解

&#x1f4e2; Vue 3 WebSocket 实战&#xff1a;公司通知实时推送功能详解 &#x1f4cc; 收藏 点赞 关注&#xff0c;项目中要用到推送功能时就不怕找不到了&#xff01; 实时通知是企业系统中常见的功能&#xff0c;比如&#xff1a;管理员发布通知后&#xff0c;所有用户…...

TJCTF 2025

还以为是天津的。这个比较容易&#xff0c;虽然绕了点弯&#xff0c;可还是把CP AK了&#xff0c;不过我会的别人也会&#xff0c;还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...