docker多架构镜像构建
docker多架构镜像构建
Docker 多架构镜像构建(Multi-Architecture Image Build)允许你为不同平台(如 linux/amd64, linux/arm64, linux/arm/v7 等)构建和推送统一的镜像标签,解决在不同硬件架构之间部署的问题。
Docker 官方推荐使用 buildx 来构建多架构镜像。构建完了需要往harbor仓库进行推送
安装docker buildx
安装命令:
mkdir -p $HOME/.docker/cli-plugins
wget https://github.com/docker/buildx/releases/download/v0.12.0/buildx-v0.12.0.linux-amd64 -O $HOME/.docker/cli-plugins/docker-buildx
chmod +x $HOME/.docker/cli-plugins/docker-buildx
查看插件版本:
docker buildx version
查看当前系统中 Docker Buildx 支持使用的架构
docker buildx ls
结果如下:可以看到默认是default,并且不支持arm架构
default * docker default running v0.11.7-0.20230525183624-798ad6b0ce9f linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/386
安装二进制文件格式解释器:
docker run --privileged --rm tonistiigi/binfmt --install all
此时再去查看架构支持:
[root@localhost ~]# docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS BUILDKIT PLATFORMS
default * docker default default running v0.11.7-0.20230525183624-798ad6b0ce9f linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/386, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
创建新的构建实例:
使用 docker-container 驱动程序创建一个新的构建器,它可以让您访问更复杂的功能,比如多平台构建和更高级的缓存导出功能。这些功能在默认的 docker 驱动程序中目前不受支持。
docker buildx create --name mybuilder --bootstrap --use
构建多架构镜像
编写Dockerfile:
FROM dockerpull.org/eclipse-temurin:8u392-b08-jdk-jammy# 如果容器需要操作宿主机docker
RUN apt-get update && apt-get install -y libltdl7# 将当前目录下的 java.security 文件复制到容器中指定路径
COPY java.security /opt/java/openjdk/jre/lib/security/java.security
使用 Buildx 插件构建镜像:
docker buildx build --platform=linux/arm64,linux/amd64 -t 192.168.51.52:8082/xxx/jdk8 --push .
遇到问题:
ERROR: failed to solve: failed to push 192.168.51.52:8082/xxx/jdk8: failed to do request: Head "https://192.168.51.52:8082/v2/xxx/jdk8/blobs/sha256:bb699589ec711474bb920a23601539265a47d38d3f6ca3e52cf61f5bf3143376": http: server gave HTTP response to HTTPS client
解决办法:https://github.com/docker/buildx/issues/163
新建一个配置文件buildkitd.toml:
# 配置私有仓库
[registry."192.168.51.52:8082"]http = trueinsecure = true# 配置 docker.io 的代理为 dockerpull.org
[registry."docker.io"]# mirrors = ["dockerpull.org"]http = false # 如果 dockerpull.org 使用 HTTPS,请确保设为 falseinsecure = false # 假设 dockerpull.org 使用 HTTPS
重新构建一个工具
docker buildx create --name mybuilder --config ./buildkitd.toml --bootstrap --use
此时再去构建了往自己的私有仓库harbor推送:
docker buildx build --platform=linux/arm64,linux/amd64 -t 192.168.51.52:8082/xxx/jdk8 --push .
Docker多阶段构建
举个例子,我需要在eth-security-toolbox的基础上构建一个镜像,需要在这个镜像的基础上,装一个java,但是amd和arm架构的java需要的安装包是不同的,并且还需要对java源码里的部分内容做改造,所以需要将不同架构的java的安装包拷贝到容器里进行构建:
# 修改后(正确:使用目标平台架构)
FROM --platform=$TARGETPLATFORM docker.1ms.run/trailofbits/eth-security-toolbox:nightly-20241209 AS baseUSER root
RUN solc-select install 0.8.19 && solc-select use 0.8.19
WORKDIR /opt# ========== 平台感知最终阶段 ==========
FROM base AS finalARG TARGETARCH
# docker buildx 会自动设置这个变量为 amd64 或 arm64COPY jdk_amd64.tar.gz .
COPY jdk_arm64.tar.gz .# 选择正确的包名
RUN set -eux; \if [ "$TARGETARCH" = "amd64" ]; then \tar -xzf jdk_amd64.tar.gz -C /opt && rm -f jdk_amd64.tar.gz jdk_arm64.tar.gz; \elif [ "$TARGETARCH" = "arm64" ]; then \tar -xzf jdk_arm64.tar.gz -C /opt && rm -f jdk_amd64.tar.gz jdk_arm64.tar.gz; \else \echo "Unsupported arch: $TARGETARCH" && exit 1; \fiENV JAVA_HOME=/opt/jdk8u392-b08
ENV PATH=$JAVA_HOME/bin:$PATH# 可选测试(可注释)
# RUN java -version
构建脚本:
docker buildx build --platform=linux/arm64,linux/amd64 -t 192.168.51.52:8082/xxx/contract-base:latest --push --no-cache .
FROM --platform=$TARGETPLATFORM ... AS base:指定基础镜像的平台与目标平台一致。$TARGETPLATFORM是 Docker Buildx 自动注入的变量,值为linux/amd64、linux/arm64,这里是为了确保基础镜像的架构与最终构建目标匹配,避免跨平台兼容问题。ARG TARGETARCH:声明一个构建参数TARGETARCH,其值由 Docker Buildx 自动注入。在多平台构建时,TARGETARCH会根据--platform参数动态设置为amd64或arm64- **
RUN set -eux; if [ "$TARGETARCH" = "amd64" ]; then ...**根据TARGETARCH的值动态选择解压对应的 JDK。
测试阶段:
测试构建后java是否可用,下面的命令可以分别在amd和arm机器上执行:
docker run --rm -it 192.168.51.52:8082/xxx/contract-base:test java -version
或者也可以进入构建后的容器:
docker run --rm -it --platform=linux/amd64 192.168.51.52:8082/xxx/contract-base:test /bin/bash
使用下面命令来判断是不是对应架构的,但是使用docker inspect images命令不准,还是进入容器比较好:
uname -m
判断构建的镜像 manifest 是不是双架构的
docker buildx imagetools inspect 192.168.51.52:8082/xxx/contract-base:test
##参考文档
使用 Docker 构建多架构镜像
相关文章:
docker多架构镜像构建
docker多架构镜像构建 Docker 多架构镜像构建(Multi-Architecture Image Build)允许你为不同平台(如 linux/amd64, linux/arm64, linux/arm/v7 等)构建和推送统一的镜像标签,解决在不同硬件架构之间部署的问题。 Doc…...
机器学习常用算法总结
1. 概述 机器学习的定义是对于某类任务T和性能度量P,如果一个计算机程序在T上其性能P随着经验E而自我完善,那么我们就称这个系统从经验E中学习,机器学习是人工智能的一种方法,它通过在大量数据中学习隐藏的规则,模式和…...
软件架构设计:MVC、MVP、MVVM、RIA 四大风格优劣剖析
MVC、MVP、MVVM 和 RIA 都是软件架构中常见的设计风格,以下是对它们的详细介绍: 一、MVC 架构风格(Model - View - Controller) 1.简介:MVC 架构风格将软件应用程序分为三个核心部分,通过这种划分来分离不…...
Android12 自定义系统服务
在Android中可以通过两种方式创建系统服务: 由SystemServer启动的系统服务,使用SystemServer线程资源,适合轻量级的服务,比如各种XMS服务;占用独立进程,在系统启动时,由init进程拉起,比如SurfaceFlinger;本文采用的是第一种方式。 自定义AssistantManagerService 参…...
Flink SQL SavePoint最佳实践
以下是 Flink SQL Savepoint 最佳实践,涵盖配置、触发、恢复及注意事项,高效管理作业状态: 一、Savepoint 的配置与触发 1. 基础配置 存储路径:在 flink-conf.yaml 中全局设置 Savepoint 存储目录,避免每次手动指定路…...
【STM32】在FreeRTOS下使用硬件SPI收发数据出现的时序耦合问题(WK2124芯片为例)
问题 STM32中在Freertos使用SPI通讯芯片 WK2124进行SPI转4串口时,接收数据为一个任务,发送数据为一个任务,切接受任务优先级更高实测发现收发一段时间(约几分钟)外扩芯片会死锁导致WK2124复位。 分析 首先ÿ…...
关于香橙派OrangePi 5 Ultra 这个开源板子,开发Android
我下载了它资料中的开源Android13 系统SDK, 这个SDK连个git 都没有,把这种代码释放能称为开源吗?? 并且也就是说你买了这个板子,里面是没有任何关于RK3588的开发文档,如果你没玩过其他RK平台,估…...
ubuntu启动 Google Chrome 时默认使用中文界面,设置一个永久的启动方式
方法 :通过桌面快捷方式设置 编辑 Chrome 的桌面快捷方式: 找到您的 Google Chrome 快捷方式文件。如果是通过菜单启动,通常会在以下路径找到与 Chrome 相关的 .desktop 文件: sudo vim /usr/share/applications/google-chrome.d…...
字节跳动开源 Godel-Rescheduler:适用于云原生系统的全局最优重调度框架
背景 在云原生调度中,一次调度往往无法解决所有问题,需要配合重调度来优化资源分配和任务摆放。传统的重调度框架主要集中在识别异常节点或任务,并通过迁移或删除来解决。然而,这些框架往往只能解决局部问题,无法提供…...
WINUI——Background小结
在 WinUI/UWP XAML 中,Background(或其他颜色属性)支持 多种颜色表示方式,包括以下三种主流格式: 1. RGB 十六进制(不透明) 格式:#RRGGBB特点…...
Oracle数据库数据编程SQL<01. 课外关注:数据库查重方法全面详解>
查重是数据库管理和数据分析中的常见需求,以下是各种查重方法的全面总结,涵盖不同场景和技术手段。 更多Oracle学习内容请查看:Oracle保姆级超详细系列教程_Tyler先森的博客-CSDN博客 目录 一、基础SQL查重方法 1. 使用GROUP BY和HAVING …...
开源技术如何助力中小企业实现财务管理自主化?
中小企业的数字化困境与开源机遇 国际数据公司(IDC)研究显示,全球67%的中小企业因高昂的软件成本和僵化的功能设计,未能有效推进数字化转型。传统商业软件常面临三大矛盾: 功能冗余与核心需求缺失:标准化系…...
边缘计算与隐私计算的融合:构建数据经济的“隐形护盾“
在数据成为核心生产要素的今天,边缘计算与隐私计算的交汇正在重塑技术生态。这并非简单的技术叠加,而是一场关于数据主权、算力分配与信任机制的深度博弈。本文将从"数据流动的拓扑学"视角,探讨二者融合如何重构数字社会的基础设施…...
【大模型实战篇】--阿里云百炼搭建MCP Agent
MCP协议(Model Communication Protocol,模型通信协议)是大语言模型(LLM)与外部系统或其他模型交互时的一种标准化通信框架,旨在提升交互效率、安全性和可扩展性。 目录 1.阿里云百炼--MCP 1.1.MCP 服务接…...
基于PySide6与pycatia的CATIA智能倒角工具开发全解析
引言:工业设计中的倒角革命 在机械设计领域,倒角操作是零件加工前的必要工序。传统手动操作效率低下且易出错本文基于PySide6pycatia技术栈,提出一种支持批量智能倒角、参数动态校验、跨层级操作的自动化方案,其核心突破体现在&a…...
css 二维码始终显示在按钮的正下方,并且根据不同的屏幕分辨率自动调整位置
一、需求 “求职入口” 下面的浮窗位置在其正下方,并且浏览器分辨的改变(拖动浏览器),位置依旧在最下方 二、实现 <div class"btn_box"><div class"btn_link id"js-apply">求职入口<di…...
串口接收的使用-中断
1、引言 单片机串口、按键等等这种外部输入的, 用轮询的方式非常浪费资源,所以最好的方法就是使用中断接收数据。 2、串口 对于串口中断, 使用的非常频繁。 1. 基本原理 串口中断接收通过以下方式工作: 当串口接收到一个字节…...
处理 Flutter 没有反应
现象 有以下几种 VS Code 中 Initializing the Flutter SDK. This may take a few minutes. 会一直维持在这个右下角提示窗, 但是无后续动作 Flutter CMD flutter_console.bat 执行 --version 或者 doctor [-v] 没有任何输出, 命令卡住 解决办法 参考官方说明 管理员身份…...
Linux-服务器负载评估方法
在 Linux 服务器中,top 命令显示的 load average(平均负载)反映了系统在特定时间段内的负载情况。它通常显示为三个数值,分别代表过去 1 分钟、5 分钟和 15 分钟的平均负载。 1. 什么是 Load Average? Load average …...
入门51单片机(1)-----点灯大师梦开始的地方
前言 这一次的博客主要是要记录一下学习的记录的,方便以后去复习一下的,当然这篇博客还是针于零基础的伙伴萌,看完这篇博客,大家就可以学会点灯了。 安装软件 方法一下一下来教!!萌新宝贝萌可以学会的!帮…...
3.数组(随想录)
1.二分查找 *2.移除元素 还有一个小优化(可以不看) 3.有序数组的平方 *4.长度最小的子数组 (3种解法) 5.螺旋矩阵 ||...
解决import pyqtgraph.opengl报错
在使用pyqtgraph时,出现没有OpenGL模块的报错 报错信息 ModuleNotFoundError: No module named OpenGL 解决方案 该环境下没有安装OpenGL库导致,输入以下代码进行安装: pip install PyOpenGL conda install -c conda-forge pyopengl 安…...
大模型面经 | 请你介绍一下ReAct(Reasoning and Acting)?
大家好,我是皮先生!! 今天给大家分享一些关于大模型面试常见的面试题,希望对大家的面试有所帮助。 往期回顾: 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题一) 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题二) 大模型面经 | 春招、秋招算法…...
C#设计模式-状态模式
状态模式案例解析:三态循环灯的实现 案例概述 本案例使用 状态模式(State Pattern) 实现了一个 三态循环灯 的功能。每点击一次按钮,灯的状态会按顺序切换(状态1 → 状态2 → 状态3 → 状态1...)ÿ…...
LLM实现text2SQL实战总结
LLM在组织内部应用的一类重要场景就是利用LLM的NL2SQL能力,简化用户对数据库的访问。本文主要介绍如何使用LLM生成SQL语句,不涉及到如何训练提升LLM的SQL生成能力。 开启正文之前,我们先明确一下这类功能在组织内服务的目标群体。我们将服务目…...
字节跳动开源 LangManus:不止是 Manus 平替,更是下一代 AI 自动化引擎
当 “AI 自动化” 成为科技领域最炙手可热的关键词,我们仿佛置身于一场激动人心的变革前夜。各行各业都在翘首以盼,期待 AI 技术能够真正解放生产力,将人类从繁琐重复的工作中解脱出来。在这个充满无限可能的时代,字节跳动悄然发布…...
21.C++11
1.列表初始化 1.1C11中的{} •C11以后想统⼀初始化⽅式,试图实现⼀切对象皆可⽤{}初始化,{}初始化也叫做列表初始化。 • 内置类型⽀持,⾃定义类型也⽀持,⾃定义类型本质是类型转换,中间会产⽣临时对象,最…...
STM32 HAL库之WDG示例代码
独立看门狗(IWDG) 初始化独立看门狗,在main.c中的 MX_IWDG_Init();,也就是iwdg.c中的初始化代码 void MX_IWDG_Init(void) {/* USER CODE BEGIN IWDG_Init 0 *//* USER CODE END IWDG_Init 0 *//* USER CODE BEGIN IWDG_Init 1 …...
Spring AI 发布了它的 1.0.0 版本的第七个里程碑(M7)
Spring AI 发布了它的 1.0.0 版本的第七个里程碑(M7),下个月就是 RC1,紧接着就是 GA!,对于我们 Java 开发者来说,这绝对是个值得关注的好消息! 但是对于 Java 学习者来说,…...
jdk 安装
oracle官网 : Java Archive | Oracle 中国 export JAVA_HOME/Users/xxxxx/app/services/x86jdk/jdk1.8.0_431.jdk/Contents/Home export PATH$JAVA_HOME/bin:$PATH 华为镜像网站:Index of java-local/jdk...
