时间:2021-07-15 | 标签: | 作者:Q8 | 来源:孔矾建网络
小提示:您能找到这篇{腾讯云多平台容器镜像构建(下)}绝对不是偶然,我们能帮您找到潜在客户,解决您的困扰。如果您对本页介绍的腾讯云多平台容器镜像构建(下)内容感兴趣,有相关需求意向欢迎拨打我们的服务热线,或留言咨询,我们将第一时间联系您! |
创建Manifest List < ">我们使用docker manifest子命令管理manifest list。其中,docker manifest create子命令用于在本地创建一个manifest list。该命令需要指定待manifest list地址和一系列的manifests。例如需要创建包含amd64和arm64两个平台镜像的manifest list,则命令如: docker manifest create kofj/multi-demo kofj/multi-demo:amd64 kofj/multi-demo:arm64 < ">docker manifest create命令的详细帮助信息如下所示: # docker manifest create --help Usage: docker manifest create MANIFEST_LIST MANIFEST [MANIFEST...] Create a local manifest list for annotating and pushing to a registry Options: -a, --amend Amend an existing manifest list --insecure Allow communication with an insecure registry < ">我们按照上述方法创建出来的manifest list中并没有说明其中的manifest是什么操作系统和平台的,docker manifest annotate命令用于注释创建出来的manifest list。例如注释某个manifest是linxu系统arm64平台的,则命令: docker manifest annotate kofj/multi-demo kofj/multi-demo:arm64--os linux--arch arm64 < ">docker manifest annotate命令的详细帮助信息如下所示: # docker manifest annotate --help Usage: docker manifest annotate [OPTIONS] MANIFEST_LIST MANIFEST Add additional information to a local image manifest Options: --arch string Set architecture --os string Set operating system --os-features strings Set operating system feature --variant string Set architecture variant < ">注意: < ">1.创建manifest list清单的过程中会检查远端仓库中manifests是否存在,所以我们必修提前推送镜像到远端。如果远端仓库是不安全的,在创建的过程中需要添加参数--inseure。 < ">2.使用docker manifest annotate注释manifest list的时候不需要使用--insecure。 < ">为了方便使用,我们可以使用下述代码段-06的脚本创建manifest list。 //代码段-06 #!/bin/bash IMAGE?=kofj/multi-demo NOCOLOR:='33[0m' RED:='33[0;31m' GREEN:='33[0;32m' LINUX_ARCH?=amd64 arm64 riscv64 IMAGES=$(foreach arch,$(LINUX_ARCH),$(IMAGE):$(arch)) echo${GREEN}Create manifest for${RED}(${LINUX_ARCH})${NOCOLOR}; docker manifest create${IMAGE}${IMAGES} for arch in${LINUX_ARCH};do echo${GREEN}Annotate manifest${RED}linux/$$arch${NOCOLOR}; echo===================; docker manifest annotate${IMAGE}${IMAGE}:$$arch--os linux--arch$$arch; done 推送manifest list < ">当我们完成manifest list的创建工作后,它还是存储在本地的。这时候,还需要推送到远端的镜像仓库。与推送普通镜像不同,推送manifest list需要使用docker manifest push命令进行。如果我们要推送kofj/multi-demo这个manifest list,则命令如: docker manifest push kofj/multi-demo < ">使用docker manifest push命令可以通过附加--purge选项在推送完成后删除存储在本地的manifest list;当我们的目标仓库没有使用或者使用了非可信TLS证书的时候,则需要使用--insecure选项。 < ">buildx自动构建 < ">软件依赖 < ">Docker≥19.03:自该Docker版本包含buildx。 < ">Linux kernel≥4.8:自该Linux内核版本binfmt_misc支持fix-binary(F)flag。fix_binary标志允许内核在容器或chroot内使用binfmt_misc注册的二进制格式处理程序,即使该处理程序二进制文件不是该容器或chroot内可见的文件系统的一部分。 < ">binfmt_misc file system mounted:需要挂载binfmt_misc文件系统,以便用户空间工具可以控制此内核功能,即注册和启用处理程序。 < ">Docker Desktop≥2.1.0 如果是使用的Docker Desktop。 配置Buildx < ">buildx从19.03开始与Docker CE捆绑发布,但是需要我们在Docker CLI上CCTV广告启用实验性功能开开启。可以通过两种方式启用它: < ">1.将"experimental":"enabled”添加到Docker CLI的配置文件~/.docker/config.json。 < ">2.另外一种方法时设置环境变量DOCKER_CLI_EXPERIMENTAL=enabled。 < ">使用Docker Desktop的同学可以通过UI菜单Preferences→Command Line进入Docker CLI配置界面,通过Switch开关Enable experimental features启用实验性功能。 < ">如果需要使用最新版本的buildx,可以从https://github.com/docker/buildx/releases/latest下载最新的二进制发行版,并将其复制到~/.docker/cli-plugins文件夹中,重命名为docker-buildx,然后更改执行权限: chmod+x~/.docker/cli-plugins/docker-buildx < ">最后让我们验证buildx是否已经可用了: $docker buildx version github.com/docker/buildx v0.3.1-tp-docker 6db68d029599c6710a32aa7adcba8e5a344795a7 配置binfmt_misc < ">QEMU是一个很棒的开源项目,它可以模拟很多平台。将QEMU和Docker结合起来使用能使得我们更容易的构建跨平台的容器镜像。集成QEMU依赖于Linux内核功能。Linux内核中的binfmt_misc功能可以使得内核识别任意类型的可以执行文件格式,并传递到特定的用户空间应用程序和虚拟机(https://zh.wikipedia.org/wiki/Binfmt_misc)。当Linux遇到一种无法识别的可执行文件格式(比如说其它平台的可执行文件格式)时,它会检查有没有配置任何“用户空间应用程序”用于处理它。如果检测到了,就将可执行文件传递给该应用程序。 < ">为此,我们需要在内核当中注册其它平台的可执行文件格式。 < ">对于使用Docker Desktop(MacOS和Windows上都是)的同学,因为默认配置了binfmt_misc,可以跳过这一步。而使用Linux发行版操作系统的同学则需要自行安装配置binfmt_misc,以便能够非原生的其它平台的镜像。 < ">要在宿主机上执行其它CPU平台的指令,需要安装QEMU模拟器。因为程序执行时会在当前程序可见的文件系统中查找动态库,而在容器或chroot环境中注册的处理程序在其它的cgroup namespace中可能无法找到,所以需要静态编译连接的QEMU。同时,我们需要安装一个包含足够新的update-binfmts二进制文件的包,以便能够支持fix-binary(F)标志,并在注册QEMU模拟器时实际使用,这样才能结合buildx一起镜像跨平台构建。 < ">QEMU和binfmt_misc支持工具可以通过宿主机或者Docker容器镜像安装。但是,使用Docker镜像安装配置能让事情变得更加简单。镜像docker/binfmt中包含QEMU二进制文件和在binfmt_misc中注册QEMU的安装脚本。 docker run--privileged docker/binfmt:66f9012c56a8316f9244ffd7622d7c21c1f6f28d < ">执行完后,我们验证下是否注册成功了。成功注册后,/proc/sys/fs/binfmt_misc目录中会有多个qemu-前缀的文件。查看/proc/sys/fs/binfmt_misc/qemu-aarch64文件内容,可以看到falgs标志为OCF,说明这个处理程序是通过(F)标志注册的,能够正常的结合buildx完成跨平台构建。 root kofj-hk~ls-al/proc/sys/fs/binfmt_misc total 0 drwxr-xr-x 2 root root 0 Oct 12 20:19. dr-xr-xr-x 1 root root 0 Oct 12 20:19.. -rw-r--r--1 root root 0 Oct 12 20:19 python2.7 -rw-r--r--1 root root 0 Oct 12 20:19 python3.6 -rw-r--r--1 root root 0 Oct 12 20:21 qemu-aarch64 -rw-r--r--1 root root 0 Oct 12 20:21 qemu-arm -rw-r--r--1 root root 0 Oct 12 20:21 qemu-ppc64le -rw-r--r--1 root root 0 Oct 12 20:21 qemu-s390x --w-------1 root root 0 Oct 12 20:19 register -rw-r--r--1 root root 0 Oct 12 20:19 status root kofj-hk~cat/proc/sys/fs/binfmt_misc/qemu-aarch64 enabled interpreter/usr/bin/qemu-aarch64 flags:OCF offset 0 magic 7f454c460201010000000000000000000200b7 mask ffffffffffffff00fffffffffffffffffeffff 使用buildx构建 < ">前置依赖注备好后,我们终于可以使用buildx构建多平台镜像了。与其它方案不同的是,使用buildx可以让我们不必改动dockerfile。 < ">Buildx始终使用BuildKit引擎构建镜像,不需要配置环境变量DOCKER_BUILDKIT=1。BuildKit可以很好的用于多个平台的构建,而不仅适用于我们当前构建镜像时所使用的平台和操作系统。进行构建时,使用--platform标志可以用于指定构建输出的目标平台(例如linux/amd64,linux/arm64,linux/riscv64)。 < ">首先,我们先准备好Dockerfile文件: FROM golang:1.14 as builder COPY./src WORKDIR/src RUN ls-al&&go build-a-tags netgo-ldflags'-w'-mod=vendor-v-o/src/bin/webapp/src/cmd/main.go #Final image FROM ubuntu:18.04 LABEL authors="Fanjian Kong" COPY--from=builder/src/bin/webapp/app/ WORKDIR/app CMD["/app/webapp"] < ">然后,让我们尝试下运行buildx。 root kofj-hk~docker buildx build--platform linux/amd64,linux/arm64,linux/arm-t harbor-community.tencentcloudcr.com/multi-arch/demo:2020-10-12.--push error:auto-push is currently not implemented for docker driver,please create a new builder instance < ">居然报错error:auto-push is currently not implemented for docker driver,please create a new builder instance了!别担心,这是因为Docker默认的builder是不支持多平台构建的。我们可以通过docker buildx ls查看当前节点上的builder有哪些。 root kofj-hk~docker buildx ls NAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS default*docker default default running linux/amd64,linux/386 < ">为了使用多平台构建功能,我们需要新建一个builder,并设置当前builder为新建的。 #新建同时切换builder docker buildx create--use--name mybuilder #只新建,然后再切换builder docker buildx create--name mybuilder docker buildx use mybuilder < ">现在,让我们再次执行buildx,看着一切向着期待的方向发展了。 注意事项 < ">注意1:到目前位置,buildx支持linux/amd64,linux/386,linux/arm/v7,linux/arm/v6,linux/arm64,linux/ppc64le,linux/s390x。所以docker/binfmt镜像仅注册了arm、ppc64le和s390x的处理程序。如果你需要构建、运行RISC-V平台的容器镜像,建议使用multiarch/qemu-user-static镜像镜像配置。 docker run--rm--privileged multiarch/qemu-user-static--reset-p yes < ">注意2:在软件依赖中我们提到需要Linux内核版本>=4.8.0;如果在内核版本为3.10.0的系统(比如CentOS)上运行docker/binfmt,会出现报错Cannot write to/proc/sys/fs/binfmt_misc/register:write/proc/sys/fs/binfmt_misc/register:invalid argument,这是由于内核不支持(F)标志造成的。出现这种情况,建议您升级系统内核或者换使用较高版本内核的Linux发行版。 < ">小结 < ">多年前,大规模部署应用程序是一项非常耗费人力、财力、时间,还需要大量技能和技巧的事务,工程师们还需要应对应用程序所运行的每一台服务器的环境差异。这对大公司而言是个极其沉重的负担,小公司更是无力应对。 < ">正如多年前人们无法想象大规模部署复杂的应用程序只需要一个kubectl create命令,不久前我们也不会想到构建多平台的容器镜像只需要一个docker buildx build。但是,我们还有更加广阔的想象空间,自动化流程、更多平台的支持、更智能简单的工具,你能想到的都有可能在不久的将来变成现实。 < ">技术的发展进步,不断降低了生产活动中社会平均劳动时间,提升了生产力,能够释放劳动者去做更多有益的探索。让我们不断学习、拥抱、应用新技术,在时代的浪潮中勇往直前。 可执行方案舆情监测与应对回顾 < ">1.确保使用的Linux发行版内核>=4.8.0(推荐使用Ubuntu 18.04以上的TLS发行版),且Docker>=19.03; < ">2.启用Docker CLI实验性功能:export DOCKER_CLI_EXPERIMENTAL=enabled; < ">3.配置其它平台的模拟器:docker run--privileged docker/binfmt:66f9012c56a8316f9244ffd7622d7c21c1f6f28d; < ">4.新建Docker builder实例支持多平台构建:docker buildx create--use--name mybuilder; < ">5.在项目目录中执行构建:docker buildx build--platform linux/amd64,linux/arm64,linux/arm-t harbor-community.tencentcloudcr.com/${YOUR_NAMESPACE}/multi-arch:2020-10-12.--push。 < ">6.相关演示代码、脚本可以在https://github.com/kofj/multi-arch-demo.git获取。 推广时间 < ">目前,腾讯云容器镜像服务TCR已完成公测进入商业化阶段。我们也已经对部分用户开放了Multi Arch镜像和OCI云原生制品支持。如果您对该功能感兴趣,欢迎联系客服开通。 |
上一篇:Google Play:打造适用于 Daydream 和 Google Cardboard 的
下一篇:Google Play:使用 Android Vitals 改进您的应用的性能
基于对传统行业渠道的理解,对互联网行业的渠道我们可以下这样一个定义:一切...
小米应用商店的后台操作和苹果是比较相似的,因为都能填写100字符关键词,允许...
小米的规则目前是在变更中的,但是根据经验小米的搜索排名评分的高低是个很重...
为了恰饭,有时候是要接入一些广告的,所以FB也专门有一个广告的SDK,这就是A...
在 2018 年于旧金山举行的游戏开发者大会上,Amazon Web Services (AWS) 曾宣布,目前世...
关于Facebook Audience Network如何收款的问题,其实官方已经给了详细的步骤。本文主要...
本文介绍了Audience Network对广告载体的质量检查,以及它重点广告形式需要注意的问...
随着iOS开发,作为开发者或公司需要针对iOS App开发涉及的方方面面作出对应的信息...
Facebook和谷歌对出海企业广告渠道都很熟悉,但事实上,在国外还有一些渠道也很...
卖家从做号的第1分钟开始,就一定要想好变现路径是什么?一定要以变现为目的去...
小提示:您应该对本页介绍的“腾讯云多平台容器镜像构建(下)”相关内容感兴趣,若您有相关需求欢迎拨打我们的服务热线或留言咨询,我们尽快与您联系沟通腾讯云多平台容器镜像构建(下)的相关事宜。
关键词:腾讯云多平台容器镜像构