使用dockermanifest构建跨平台镜像在当今的软件开发领域中,构建跨平台应用程序已经成为了一个普遍存在的需

dockermanifest是Docker的一个命令,它提供了一种方便的方式来管理不同操作系统和硬件架构的Docker镜像。通过dockermanifest,用户可以创建一个虚拟的Docker镜像,其中包含了多个实际的Docker镜像,每个实际的Docker镜像对应一个不同的操作系统和硬件架构。

dockermanifest命令本身并不执行任何操作。为了操作一个manifest或manifestlist,必须使用其中一个子命令。

manifest可以理解为是一个JSON文件,单个manifest包含有关镜像的信息,例如层(layers)、大小(size)和摘要(digest)等。

manifestlist是通过指定一个或多个(理想情况下是多个)镜像名称创建的镜像列表(即上面所说的虚拟Docker镜像)。可以像普通镜像一样使用dockerpull和dockerrun等命令来操作它。manifestlist通常被称为「多架构镜像」。

注意:dockermanifest命令是实验性的,还未转正。旨在用于测试和反馈,因此其功能和用法可能会在不同版本之间发生变化。

工欲善其事,必先利其器,如果想使用dockermanifest构建多架构镜像,需要具备以下条件。

本文中演示程序所使用的环境是AppleM2芯片平台。本地的Docker版本如下:

$dockerversionClient:Cloudintegration:v1.0.29Version:20.10.21APIversion:1.41Goversion:go1.18.7Gitcommit:baeda1fBuilt:TueOct2518:01:182022OS/Arch:darwin/arm64Context:defaultExperimental:trueServer:DockerDesktop4.15.0(93002)Engine:Version:20.10.21APIversion:1.41(minimumversion1.12)Goversion:go1.18.7Gitcommit:3056208Built:TueOct2517:59:412022OS/Arch:linux/arm64Experimental:falsecontainerd:Version:1.6.10GitCommit:770bd0108c32f3fb5c73ae1264f7e503fe7b2661runc:Version:1.1.4GitCommit:v1.1.4-0-g5fd4c4ddocker-init:Version:0.19.0GitCommit:de40ad0准备Dockerfile首先准备如下Dockerfile文件,用来构建镜像。

因为本机为AppleM2芯片,所以使用dockerbuild命令构建镜像默认为arm64平台镜像。构建命令如下:

$dockerbuild-tjianghushinian/echo-platform-arm64.[+]Building15.6s(6/6)FINISHED=>[internal]loadbuilddefinitionfromDockerfile0.0s=>=>transferringdockerfile:94B0.0s=>[internal]load.dockerignore0.0s=>=>transferringcontext:2B0.0s=>[internal]loadmetadatafordocker.io/library/alpine:latest15.5s=>[1/2]FROMdocker.io/library/alpine@sha256:21a3deaa0d32a8057914f36584b5288d2e5ecc984380bc010.0s=>CACHED[2/2]RUNuname-a>/os.txt0.0s=>exportingtoimage0.0s=>=>exportinglayers0.0s=>=>writingimagesha256:f017783a39920aa4646f87d7e5a2d67ab51aab479147d60e5372f8749c3742bb0.0s=>=>namingtodocker.io/jianghushinian/echo-platform-arm640.0sUse'dockerscan'torunSnyktestsagainstimagestofindvulnerabilitiesandlearnhowtofixthem注意:jianghushinian是我的DockerHub用户名,你在构建镜像时应该使用自己的DockerHub用户名。

如果得到如上类似输出,表明构建成功。

使用dockerrun运行容器进行测试:

$dockerrun--rmjianghushinian/echo-platform-arm64Linuxbuildkitsandbox5.15.49-linuxkit#1SMPPREEMPTTueSep1307:51:32UTC2022aarch64Linux输出内容中的aarch64就表示ARMv8架构。

无需切换设备,在AppleM2芯片的机器上我们可以直接构建amd64也就是Linux平台镜像,dockerbuild命令提供了--platform参数可以构建跨平台镜像。

$dockerbuild--platform=linux/amd64-tjianghushinian/echo-platform-amd64.[+]Building15.7s(6/6)FINISHED=>[internal]loadbuilddefinitionfromDockerfile0.0s=>=>transferringdockerfile:36B0.0s=>[internal]load.dockerignore0.0s=>=>transferringcontext:2B0.0s=>[internal]loadmetadatafordocker.io/library/alpine:latest15.3s=>CACHED[1/2]FROMdocker.io/library/alpine@sha256:21a3deaa0d32a8057914f36584b5288d2e5ecc984380bc0118285c70fa8c93000.0s=>[2/2]RUNuname-a>/os.txt0.2s=>exportingtoimage0.0s=>=>exportinglayers0.0s=>=>writingimagesha256:5c48af5176402727627cc18136d78f87f0793ccf61e3e3fb4df98391a69e9f700.0s=>=>namingtodocker.io/jianghushinian/echo-platform-amd640.0sUse'dockerscan'torunSnyktestsagainstimagestofindvulnerabilitiesandlearnhowtofixthem镜像构建成功后,同样使用dockerpush命令推送镜像到DockerHub:

你也许会好奇,在AppleM2芯片的主机设备上运行amd64平台镜像会怎样。目前咱们构建的这个简单镜像其实是能够运行的,只不过会得到一条警告信息:

$dockerrun--rmjianghushinian/echo-platform-amd64WARNING:Therequestedimage'splatform(linux/amd64)doesnotmatchthedetectedhostplatform(linux/arm64/v8)andnospecificplatformwasrequestedLinuxbuildkitsandbox5.15.49-linuxkit#1SMPPREEMPTTueSep1307:51:32UTC2022x86_64Linux输出内容中的x86_64就表示AMD64架构。

注意:虽然这个简单的镜像能够运行成功,但如果容器内部程序不支持跨平台,amd64平台镜像无法在arm64平台运行成功。

#dockerrun--rmjianghushinian/echo-platform-arm64WARNING:Therequestedimage'splatform(linux/arm64/v8)doesnotmatchthedetectedhostplatform(linux/amd64)andnospecificplatformwasrequestedLinuxbuildkitsandbox5.15.49-linuxkit#1SMPPREEMPTTueSep1307:51:32UTC2022aarch64Linux在amd64架构的设备上运行amd64平台镜像则不会遇到警告问题:

#dockerrun--rmjianghushinian/echo-platform-amd64Linuxbuildkitsandbox5.15.49-linuxkit#1SMPPREEMPTTueSep1307:51:32UTC2022x86_64Linux使用manifest合并多平台镜像我们可以使用dockermanifest的子命令create创建一个manifestlist,即将多个平台的镜像合并为一个镜像。

create命令用法很简单,后面跟的第一个参数jianghushinian/echo-platform即为合并后的镜像,从第二个参数开始可以指定一个或多个不同平台的镜像。

$dockermanifestcreatejianghushinian/echo-platformjianghushinian/echo-platform-arm64jianghushinian/echo-platform-amd64Createdmanifestlistdocker.io/jianghushinian/echo-platform:latest如上输出,表明多架构镜像构建成功。

注意:在使用dockermanifestcreate命令时,确保待合并镜像都已经被推送到DockerHub镜像仓库,不然报错nosuchmanifest。这也是为什么前文在构建镜像时,都会将镜像推送到DockerHub。

此时在AppleM2芯片设备上使用dockerrun启动构建好的跨平台镜像jianghushinian/echo-platform:

$dockerrun--rmjianghushinian/echo-platformLinuxbuildkitsandbox5.4.0-80-generic#90-UbuntuSMPFriJul922:49:44UTC2021aarch64Linux没有任何问题,就像在启动jianghushinian/echo-platform-arm64镜像一样。

现在我们可以将这个跨平台镜像推送到DockerHub,不过,这回我们需要使用的命令不再是dockerpush而是manifest的子命令dockermanifestpush:

进入镜像信息详情页面的Tags标签,能够看到镜像支持amd64、arm64/v8这两个平台。

现在,我们可以在amd64架构的设备上同样使用dockerrun命令启动构建好的跨平台镜像jianghushinian/echo-platform:

#dockerrun--rmjianghushinian/echo-platformLinuxbuildkitsandbox5.4.0-80-generic#90-UbuntuSMPFriJul922:49:44UTC2021x86_64Linux输出结果没有任何问题。可以发现,无论是arm64设备还是amd64设备,虽然同样使用dockerrun--rmjianghushinian/echo-platform命令启动镜像,但它们的输出结果都表明启动的是当前平台的镜像,没有再次出现警告。

dockermanifest不止有create一个子命令,可以通过--help/-h参数查看使用帮助:

接下来我们分别看下这几个子命令的功能。

先从最熟悉的create子命令看起,来看下它都支持哪些功能。

可以发现,create子命令支持两个可选参数-a/--amend用来修订已存在的多架构镜像。

push子命令我们也见过了,使用push可以将多架构镜像推送到镜像仓库。

来看下push还支持设置哪些可选参数。

-p/--purge选项的作用是推送本地镜像到远程仓库后,删除本地manifestlist。

inspect用来查看manifest/manifestlist所包含的镜像信息。

其使用帮助如下:

指定-v/--verbose参数可以输出更多信息,包括镜像的layers和platform信息。

使用示例如下:

$dockermanifestinspectjianghushinian/echo-platform{"schemaVersion":2,"mediaType":"application/vnd.docker.distribution.manifest.list.v2+json","manifests":[{"mediaType":"application/vnd.docker.distribution.manifest.v2+json","size":735,"digest":"sha256:13cbf21fc8078fb54444992faae9aafca0706a842dfb0ab4f3447a6f14fb1359","platform":{"architecture":"amd64","os":"linux"}},{"mediaType":"application/vnd.docker.distribution.manifest.v2+json","size":735,"digest":"sha256:8eb172234961bf54a01e83d510697f09646c43c297a24f839be846414dfaf583","platform":{"architecture":"arm64","os":"linux","variant":"v8"}}]}从输出信息中可以发现,我们构建的多架构镜像jianghushinian/echo-platform包含两个manifest,可以支持amd64/arm64架构,并且都为linux系统下的镜像。

指定-v参数输出更详细信息:

例如设置操作系统版本信息,可以使用如下命令:

$dockermanifestannotate--os-versionmacOSjianghushinian/echo-platformjianghushinian/echo-platform-arm64现在使用inspect查看镜像信息已经发生变化:

{"schemaVersion":2,"mediaType":"application/vnd.docker.distribution.manifest.list.v2+json","manifests":[{"mediaType":"application/vnd.docker.distribution.manifest.v2+json","size":735,"digest":"sha256:13cbf21fc8078fb54444992faae9aafca0706a842dfb0ab4f3447a6f14fb1359","platform":{"architecture":"amd64","os":"linux"}},{"mediaType":"application/vnd.docker.distribution.manifest.v2+json","size":735,"digest":"sha256:8eb172234961bf54a01e83d510697f09646c43c297a24f839be846414dfaf583","platform":{"architecture":"arm64","os":"linux","os.version":"macOS","variant":"v8"}}]}rm最后要介绍的子命令是rm,使用rm可以删除本地一个或多个多架构镜像(manifestlists)。

$dockermanifestrmjianghushinian/echo-platform现在使用inspect查看镜像信息已经不在有os.version信息了,因为本地镜像manifestlists信息已经被删除,重新从远程镜像仓库拉下来的多架构镜像信息并不包含os.version。

$dockermanifestinspectjianghushinian/echo-platform{"schemaVersion":2,"mediaType":"application/vnd.docker.distribution.manifest.list.v2+json","manifests":[{"mediaType":"application/vnd.docker.distribution.manifest.v2+json","size":735,"digest":"sha256:13cbf21fc8078fb54444992faae9aafca0706a842dfb0ab4f3447a6f14fb1359","platform":{"architecture":"amd64","os":"linux"}},{"mediaType":"application/vnd.docker.distribution.manifest.v2+json","size":735,"digest":"sha256:8eb172234961bf54a01e83d510697f09646c43c297a24f839be846414dfaf583","platform":{"architecture":"arm64","os":"linux","variant":"v8"}}]}总结本文主要介绍了如何使用dockermanifest来实现构建跨平台镜像。

首先对dockermanifest进行了简单介绍,它是Docker的一个子命令,本身并不执行任何操作,为了操作一个manifest或manifestlist,必须使用它包含的子命令。

接着我们又在AppleM2芯片设备上构建了不同平台的镜像,然后使用manifestlist的能力将其合并成跨平台镜像。

THE END
1.跨平台开发:一码多平台,未来软件发展趋势跨平台开发是一个不断发展的领域,随着技术的进步和新的工具的出现,我们将能够更容易地创建和维护跨平台应用程序。因此,了解跨平台开发的原则和技术,对于软件开发者来说,是一个宝贵的技能。## 未来趋势和挑战 跨平台开发的未来充满了机遇和挑战。随着技术的进步,我们可以期待更加高效的开发工具和框架,以及更加无缝的https://blog.csdn.net/silenceallat/article/details/137478390
2.跨平台软件开发.pptx跨平台软件测试 总结与展望ContentsPage目录页 跨平台软件概述跨平台软件开发 跨平台软件概述跨平台软件定义与特性1.跨平台软件是指可以在多种操作系统或硬件平台上运行的软件。2.跨平台软件需要具备可移植性、兼容性和一致性。3.跨平台软件的开发需要考虑到不同平台的特性和限制。跨平台软件是指可以在多种操作系统或https://max.book118.com/html/2024/0129/8050066013006032.shtm
3.跨平台App开发框架市场占比深度分析教育系统小黄狮随着物联网、智能家居等技术的发展,跨平台App开发将不仅仅局限于手机领域,还将拓展到智能穿戴设备、智能家居等领域,跨平台开发框架将实现更多端融合,以满足不同设备的需求。 跨平台App开发框架在软件开发领域中的地位日益重要,目前,React Native、Flutter和Ionic等主流框架在市场中占据较大份额,随着技术的发展和市场的https://vvrcloud.com/post/20860.html
4.小程序的跨平台开发随着智能手机的普及和移动互联网的快速发展,小程序成为了一种受欢迎的应用形式。小程序具有轻便、快速、便捷等特点,能够为用户提供丰富的功能和服务。而在小程序开发过程中,跨平台开发技术成为了一个重要的话题。本文将探讨小程序的跨平台开发,以及它的优势和实现方法。1. 统一代码:跨平台开发技术使得开发者可以https://baijiahao.baidu.com/s?id=1766561780134000185&wfr=spider&for=pc
5.RADStudio(跨平台软件开发工具)软件介绍 RAD Studio是一款强大的跨平台编程工具,使用它可以帮助用户快速的在Windows,Linux,Mac OS,Android和IOS等系统中开发出一个交互性极强的应用程序;RAD Studio是一种聚合性的程序开发工具,该工具中另外包含了多种程序开发组件,每一个功能组件都有自身的优势以及开发功能;使用这款工具进行程序开发,用户可以使用Dehttps://www.xiazaiba.com/html/98042.html
6.NativeScript跨平台开发软件电脑版下载最新软件语言:简体中文 版本:3.3.0最新版 编程工具口碑排行榜 pycharm社区版 IntelliJ IDEA 2020 Navicat12 WebStorm 下载服务协议见页面底部 基本简介 NativeScript3.3.0已经发布,这是一款跨平台开发应用,任何大型项目都可以用nativescript来实现,效率都比java和swift高。NativeScript可以使用Javascript,CSS, XML 创建真正的Nathttp://www.onlinedown.net/soft/1180642.htm
7.FOF跨平台中文编程集成开发环境官网阅编快码2、双击【阅编快码软件编程平台】可执行文件 3、如果你是在【uos国产系统】请到设置中心开启系统开发者模式 4、可观看国产系统环境部署教程【点击本处学习】进行移动端及桌面端环境部署 中文编程 支持库 智能提示 多平台 中文跨平台软件开发 FOFStudio【中文名-阅编快码】集成了大量主流框架,单片机支持:ESP32、ESP826https://www.fofstudio.net/
8.2022年的十种软件开发趋势9.跨平台开发 Android 和 IOS 处于完全不同的世界。这些不同的操作系统限制了应用程序之间的连接和兼容性。但是,随着跨平台兼容性的出现,无论您使用什么操作系统,处理所有任务变得越来越可能。 跨平台不仅在移动操作系统中有用,而且还可以使那些使用团队协作软件或喜欢在空闲时间玩游戏的人受益。我们终于接近了一个点https://www.51cto.com/article/702177.html
9.electron一个入门简单、跨平台、企业级桌面软件开发框架 介绍 框架已经广泛应用于记账、政务、企业、医疗、学校、股票交易、ERP、娱乐、视频等领域客户端,请放心使用! 文档 特性 使用场景 1. 常规桌面软件 2. vue、react、angular、web 转换成桌面软件 3. 游戏(h5相关技术开发) https://toscode.mulanos.cn/mircle/electron-egg
10.国外应用软件开发市场的趋势与前景展望随着技术的发展和市场的全球化,跨平台开发和跨国市场成为应用软件开发者的重要机遇。通过采用跨平台开发工具和框架,开发者可以在多个操作系统和设备上进行应用软件开发,提高开发效率和覆盖范围。同时,拓展到国外市场也是一个巨大的机遇。不同国家和地区的用户需求和文化背景不同,开发者可以根据当地的市场特点和用户偏好进行https://www.9shadow.com/2023_05/article_877.html
11.SoapySDR跨平台的软件无线电开发库开发语言C/C++ 操作系统跨平台 软件类型开源软件 所属分类其他开源 软件简介 SoapySDR是开源的规范化的软件无线电开发 API和运行库,用于操作SDR硬件设备。使用SoapySDR,您可以在很多环境下对SDR设备进行实例化、配置以及流输入输出操作。 绝大多数市面的软件无线电设备都受到SoapySDR支持,并且有非常多的开源应用软件依赖https://www.elecfans.com/soft/Mec/2022/202206211850905.html
12.软件app开发平台NativeScript:NativeScript是一个开源的跨平台移动应用开发框架,支持使用JavaScript、TypeScript和Angular构建原生iOS和Android应用。 Xamarin:Xamarin是由Microsoft推出的跨平台移动应用开发框架。它使用C#编程语言,并允许开发者共享大部分代码来构建iOS和Android应用。 http://www.apppark.cn/mobile/news_t_46702.html
13.Qt软件开发全周期的各阶段工具软件开发生命周期各阶段的所有基本工具:规划、设计、开发、测试和部署https://www.qt.io/zh-cn/
14.embarcaderoradstudio适用于应用程序开发人员的高级软件工具。用于开发和管理的跨平台解决方案。https://www.embarcadero.com/cn
15.2023年推荐几款快捷的跨平台开发工具,一门支持APP和电脑端软件2023年推荐几款快捷的跨平台开发工具,一门支持APP和电脑端软件一键在线开发 说到跨官方制作工具,很多人第一会想到PhoneGap这样一款可以让制作者使用HTML、JS、CSS来制作跨官方移动App的开源免费框架,一直以来都深受制作者喜爱,从iOS、Android、BB十、Windows Phone到Amazon Fire OS、Tizen等。 https://www.yimenapp.com/kb-yimen/14856/
16.跨平台BASIC开发软件PureBasic破解版V6.00LTSWin/macOS/Linux知识兔(zhishitu.cn)是一家集学习分享、学习交流、在线教育、软件下载的学习平台。跨平台BASIC开发软件PureBasic破解版V6.00 LTS Win/macOS/Linux - 知识兔https://zhishitu.cn/54-c53/c54/3570-3570.html
17.2016开发者报告:过半游戏开发者月入过万直播技术呈现快速发展的同时,直播平台业务形态同质化现象严重,亟需差异化和创新型业务,200多家直播平台企业参与竞争,近6成直播平台以社交、秀场类型形态业务为主。 国内企业软件开发流程日益规范化,并重视研发工具的使用,80%的开发团队制定了正式的软件开发流程,60%以上的开发团队使用各类型研发工具以提高开发效率和产品https://www.gameres.com/693049.html
18.智能座舱平台:智能座舱加速进入跨域融合,软件分层设计新时代在EEA集中化、高算力芯片、软件开发能力提升等推动下,座舱域不断集成新的功能,智能座舱正从单域向跨域融合方向演进,如座舱域与ADAS域融合,甚至部分企业已着手车云一体化多域中央计算平台研发布局。 2022年初,中科创达发布的全新智能座舱解决方案,基于高通SA8295实现一芯多屏座舱域控方案,并在高算力和多摄像头支持能https://www.dongchedi.com/article/7101929996524175904
19.使用flutter+rust开发的跨平台聚合软件益达app,导入规则后即可使用flutter + rust 开发的跨平台聚合软件益达app,导入规则后即可免费追剧、看小说、看漫画等https://www.360doc.cn/article/47374232_1124221138.html