jjzjj

docker使用buildx构建多平台(x86,arm64)构架镜像

IT杂人 2023-07-12 原文

配置文件激活buildx

  • docker目前使用版本为Server Version: 20.10.7,添加配置支持buildx

    docker版本较低时,请升级docker版本

    $ vim /etc/docker/daemon.json
    {
      "experimental": true
    }
    
  • 重启docker
    #验证buildx版本
    docker buildx version
    
    #重启docker ***
    systemctl restart docker
    
    #检查是否启用
    docker info|grep Experimental
    

环境准备(需要联网)

  • 系统环境要求

    如果版本较低,需要升级内核

    uname -a #内核版本要求4.8+
    
  • 安装binfmt,支持的平台
    安装编译时需要支持的平台,这里选择所有

    binfmt-support >= 2.1.7,需要联网docker-hub

    docker run --privileged --rm tonistiigi/binfmt --install all
    
  • 初始化buildx构造器(不需要仓库https)

    1.创建name=mybuilder且自定义配置的构造器

    docker buildx create --use \
    --name mybuilder \
    --driver docker-container \
    --config /etc/buildkitd.toml  --use default
    

    2.其中自定义配置内容
    【修改配置后,要删除旧的,重新创建构造器】

    $ vi /etc/buildkitd.toml
    debug = true
    # root is where all buildkit state is stored.
    root = "/var/lib/buildkit"
    # insecure-entitlements allows insecure entitlements, disabled by default.
    insecure-entitlements = [ "network.host", "security.insecure" ]
    
    # 你的私库地址
    # optionally mirror configuration can be done by defining it as a registry.
    [registry."192.168.69.150"]
      http = true
      insecure = true
    
    [registry."192.168.69.150:80"]
      http = true
      insecure = true
    
  • 启动构建器,会自动下载并启动buildx_buildkit_mybuilder0 的容器,需要联网docker-hub
    docker buildx inspect mybuilder --bootstrap                      #启动name=mybuilder默认构造器
    docker buildx ls                                                 #列出所有的构造器和支持的平台
    docker buildx use mybuilder                                      #使用name=buildx的构造器,ls会出现*号表示正在使用中  
    docker buildx stop mybuilder                                     #停止name=buildx的构建器   
    

制作多平台基础镜像方式1:合并(docker manifest)

【可用docker buildx imagetools代替】

检查是否启用Experimental

docker info|grep Experimental #如果未启动,则需要配置,详见最顶端

docker manifest --help   

显示添加harbor-registry的80端口的配置

因为内网环境,未使用https,而且docker很多地方未完全实现兼容默认去掉80端口,
在以后的配置中最好是添加端口使用,避免不必要的坑。

$ vim /etc/docker/daemon.json
{
  "insecure-registries":["192.168.69.150:80","192.168.69.150"],
  "registry-mirrors":["http://192.168.69.150:80","http://192.168.69.150"]
}

#重新登录
docker login 192.168.69.150:80

#重启docker ***
systemctl restart docker

创建多镜像集合

docker manifest create --insecure  192.168.69.150:80/commandcenter/centos_arm:latest \
                                   192.168.69.150:80/commandcenter/centos_arm:v1
  • –insecure,允许不安全的服务
  • 192.168.69.150:80/commandcenter/centos_arm:lates,第一个镜像名为统一的名称
  • 192.168.69.150:80/commandcenter/centos_arm:v1,后面的表示要集成的子镜像名,当然可以集成多个子镜像
  • 删除使用docker manifest rm 【manifest统一镜像名称】

修改子镜像的架构名称(可选)

当有部分默认的os/arch值没有,或者太长时,可自定义修改

docker manifest annotate  192.168.69.150:80/commandcenter/centos_arm:latest \
                          192.168.69.150:80/commandcenter/centos_arm:v1 \
                          --os linux --arch arm64
  • 指定v1版本为linux下的arm64架构

推送多镜像集合

docker manifest push --insecure  192.168.69.150:80/commandcenter/centos_arm:latest
  • –insecure,允许不安全的服务

检查是否正常

  • 进入harbor,检查镜像是否有【文件夹】的图标,点击进入是否有OS/ARCH的列
  • 拉取测试
    此处命令兼容80端口,所以可省略
    docker pull --platform=linux/arm64/v8 192.168.69.150/commandcenter/centos_arm:latest
    
  • 使用buildx时,指定platform则使用OS/ARCH的列值
  • 查看已有镜像的manifest
    docker manifest inspect --insecure 192.168.69.150:80/commandcenter/centos_arm:latest 
    

调整Dockerfile接收平台相关参数(可选,建议不写)

# 显示指定buildx传递--platform,但建议不写,在buildx后面传递platform参数即可,这样可兼容一般build命令
FROM --platform=$TARGETPLATFORM 基础镜像名:TAG

构建并导出到本地Docker images中

Dockfile中使用到的基础镜像需要支持多平台架构,如下harbor显示

一个镜像的同一个tag下,点击文件夹后,进入多平台架构列表;

Artifacts拉取命令OS/ARCHTags大小
sha256:c238d03b【有个文件夹】linux/amd64117.57MiB
sha256:74842b33linux/arm64121.57MiB
# 导出到本地只能构建一个镜像,本地不支持同时导出manifest lists
#arm64
docker buildx build -t 镜像名:版本号-arm64 --platform linux/arm64 . --load
#x86_64(amd64)
docker buildx build -t 镜像名:版本号-amd64 --platform linux/amd64 . --load

导出本地tar文件

#导出tar文件
docker save -o 镜像名.TAG.tar 镜像名:TAG

#导出tar.gz压缩文件
docker save 镜像名:TAG|gzip > 镜像名.TAG.tar.gz

推送到仓库

docker tag  镜像名:TAG 镜像仓库地址/镜像名:TAG
docker push 镜像仓库地址/镜像名:TAG 

参考

https://docs.docker.com/build/building/multi-platform/
https://blog.csdn.net/qq_34777982/article/details/123515396
https://blog.csdn.net/qq_33745102/article/details/124714360
https://blog.csdn.net/u012586326/article/details/125589644
https://docs.docker.com/build/buildkit/configure/

另:

同时构建X86_64与ARM64镜像(支持list)

制作多平台基础镜像方式2:也可用于制作基础镜像,Dockerfile一致

docker buildx build -t 镜像仓库地址/镜像名:TAG --platform linux/amd64,linux/arm64 . --push

仓库支持https,则直接创建构建器,不需要配置

docker buildx create --name builderx  --driver docker-container  #创建name=buildx的构建器
docker buildx use builderx                                       #使用name=buildx的构造器,ls会出现*号表示正在使用中
docker buildx inspect builderx --bootstrap                       #启动name=builderx默认构造器
docker buildx ls                                                 #列出所有的构造器和支持的平台
docker buildx stop builderx                                      #停止name=buildx的构建器

使用http非安全构造器方式2:待修正补充

不需要创建配置文件:–config /etc/buildkitd.toml
但不能使用–push的操作,只能使用–load;
https://docs.docker.com/engine/reference/commandline/buildx_build/#allow

#创建构造器:加--buildkitd-flags '--allow-insecure-entitlement security.insecure' 
 docker buildx create --use \
  --name mybuilder \
  --driver docker-container \
  --buildkitd-flags '--allow-insecure-entitlement security.insecure'  --use default

#生成镜像:加--allow security.insecure
 docker buildx build --allow security.insecure  -t /ubuntu_buildx:v2.2 --platform linux/arm64 . --load

有关docker使用buildx构建多平台(x86,arm64)构架镜像的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  5. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  6. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  7. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  8. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  9. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  10. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

随机推荐