Docker Buildx:构建容器镜像的瑞士军刀

Docker Buildx

Docker Buildx 是一个 Docker CLI 插件,它基于 BuildKit 提供了扩展的构建能力。它旨在提供与docker build类似的用户界面,同时解锁 BuildKit 的全部功能集。Buildx 支持多个构建器实例、用于跨平台镜像的多节点构建、Compose 构建支持以及使用 Bake 进行高级构建。

功能特性

Buildx 集成了 BuildKit 的所有能力,并提供了以下关键特性:

  • 熟悉的用户体验:命令界面与传统的docker build相似,降低了学习成本。
  • 完整的 BuildKit 能力:利用容器驱动程序,支持所有 BuildKit 的高级功能。
  • 多个构建器实例支持:可以创建和管理多个独立的构建器环境。
  • 多平台构建:无需模拟,即可为多种架构(如 linux/amd64, linux/arm64)构建镜像。
  • Compose 构建支持:直接从 Docker Compose 文件构建服务镜像。
  • Bake 高级构建:通过声明式配置文件(HCL 或 JSON)定义和构建复杂的多目标构建工作流。
  • 容器内驱动程序支持:支持在 Docker 容器和 Kubernetes Pod 中运行构建器。

安装指南

使用 Buildx 需要 Docker Engine 19.03 或更高版本。

警告:使用不兼容的 Docker 版本可能导致意外行为,并很可能引发问题。

Windows 和 macOS

Docker Desktop 已内置 Buildx,无需额外安装。

Linux 包管理器安装

可以通过系统的包管理器进行安装:

  • Debian/Ubuntu:apt-get install docker-buildx-plugin
  • RHEL/Fedora:yum install docker-buildx-plugin

手动下载

从 GitHub Releases 页面下载预编译的二进制文件,将其放置于 Docker 插件目录下(例如~/.docker/cli-plugins/),并确保其具有可执行权限。

使用 Dockerfile

您也可以在 Dockerfile 中使用FROM --platform=$BUILDPLATFORM指令,配合 Buildx 在多阶段构建中复制二进制文件。

安装为 Docker CLI 插件别名

运行以下命令,将 Buildx 设置为docker builder的别名(旧版方式,现已不推荐):

dockerbuildxinstall

若要移除别名,请运行:

dockerbuildx uninstall

使用说明

基本构建

使用buildx build命令进行构建,其参数与docker build类似:

dockerbuildx build -t your-image:tag.

管理构建器实例

Buildx 支持多个构建器实例。查看当前实例:

dockerbuildxls

创建新的构建器实例(例如使用docker-container驱动程序):

dockerbuildx create --name mybuilder --driver docker-container --use

--use标志会立即切换到新创建的构建器。

构建多平台镜像

这是 Buildx 的核心优势之一。您可以使用--platform标志指定多个平台:

dockerbuildx build --platform linux/amd64,linux/arm64 -t your-image:multiarch.

为了成功构建多平台镜像,需要确保您的构建器支持多平台(通常容器驱动程序支持),并且可能需要配置 binfmt_misc 来注册仿真器。

使用 Bake 进行高级构建

Bake 允许您使用 HCL 或 JSON 文件定义构建目标。创建一个docker-bake.hcl文件:

variable "TAG" { default = "latest" } group "default" { targets = ["app", "db"] } target "app" { context = "." dockerfile = "Dockerfile.app" tags = ["your-registry/app:${TAG}"] } target "db" { context = "./db" dockerfile = "Dockerfile" tags = ["your-registry/db:${TAG}"] }

然后运行构建:

dockerbuildx bake --set *.tags=your-registry/my-app:custom-tag

Bake 支持从多个文件(包括 Docker Compose 文件)读取配置,并允许通过命令行进行覆盖。

核心代码

以下是从 Buildx 项目中提取的一些核心代码片段,展示了其内部工作机制。

Bake 配置文件解析

bake包负责解析 Bake 的配置文件(HCL/JSON/Compose)。以下代码展示了如何读取和合并本地文件:

// 包 bake 负责解析和处理 Bake 配置文件。packagebakeimport("context""io""os""path/filepath""slices""strings")// File 结构体表示一个配置文件,包含文件名和内容。typeFilestruct{NamestringData[]byte}// ReadLocalFiles 读取指定的配置文件列表。如果未提供文件名,则使用默认文件名列表。// 它支持从标准输入("-")读取,并会为不存在的默认文件跳过错误。funcReadLocalFiles(names[]string,stdin io.Reader,l progress.SubLogger)([]File,error){isDefault:=falseiflen(names)==0{isDefault=truenames=defaultFilenames()// 获取默认文件名列表,如 docker-bake.hcl, docker-compose.yml 等}out:=make([]File,0,len(names))// 设置进度日志状态的回调函数setStatus:=func(st*client.VertexStatus){ifl!=nil{l.SetStatus(st)}}for_,n:=rangenames{vardt[]bytevarerrerrorifn=="-"{// 从标准输入读取dt,err=readWithProgress(stdin,setStatus)iferr!=nil{returnnil,err}}else{// 从文件读取,如果是默认文件且不存在,则静默跳过。dt,err=readFileWithProgress(n,isDefault,setStatus)ifdt==nil&&err==nil{continue}iferr!=nil{returnnil,err}}out=append(out,File{Name:n,Data:dt})}returnout,nil}

HCL 解析器中的函数调用提取

hclparser包包含用于处理 HCL 配置的实用函数。以下代码展示了如何从 HCL 表达式中提取函数调用:

// 包 hclparser 提供了解析和处理 HCL 配置文件的工具。packagehclparserimport("reflect""unsafe""github.com/hashicorp/hcl/v2""github.com/hashicorp/hcl/v2/hclsyntax""github.com/pkg/errors")// funcCalls 递归遍历 HCL 表达式,收集其中所有函数调用的名称。// 它处理原生的 hclsyntax 表达式和 JSON 格式的表达式。funcfuncCalls(exp hcl.Expression)([]string,hcl.Diagnostics){node,ok:=exp.(hclsyntax.Node)if!ok{// 对于 JSON 表达式,使用递归函数处理fns,err:=jsonFuncCallsRecursive(exp)iferr!=nil{returnnil,wrapErrorDiagnostic("Invalid expression",err,exp.Range().Ptr(),exp.Range().Ptr())}returnfns,nil}varfuncnames[]string// 使用 hclsyntax.VisitAll 遍历语法树节点hcldiags:=hclsyntax.VisitAll(node,func(n hclsyntax.Node)hcl.Diagnostics{iffe,ok:=n.(*hclsyntax.FunctionCallExpr);ok{funcnames=append(funcnames,fe.Name)// 收集函数名}returnnil})ifhcldiags.HasErrors(){returnnil,hcldiags}returnfuncnames,nil}

驱动程序接口与实现

driver包定义了构建器驱动程序的通用接口,不同的驱动程序(如docker-container,kubernetes)都实现此接口。以下代码展示了驱动程序信息查询和客户端连接的核心方法:

// 包 driver 定义了构建器驱动程序的接口和基础结构。packagedriverimport("context""net""sync""time""github.com/moby/buildkit/client""github.com/pkg/errors")// Driver 接口是所有 Buildx 驱动程序(如 docker、docker-container、kubernetes、remote)必须实现的契约。typeDriverinterface{Factory()FactoryBootstrap(context.Context,progress.Logger)errorInfo(context.Context)(*Info,error)Version(context.Context)(string,error)Stop(ctx context.Context,forcebool)errorRm(ctx context.Context,force,rmVolume,rmDaemonbool)errorDial(ctx context.Context)(net.Conn,error)Client(ctx context.Context,opts...client.ClientOpt)(*client.Client,error)Features(ctx context.Context)map[Feature]boolHostGatewayIP(ctx context.Context)(net.IP,error)IsMobyDriver()boolConfig()InitConfig}// Boot 是一个辅助函数,用于引导驱动程序并获取 BuildKit 客户端。// 它会尝试启动驱动程序(如果尚未运行),并在失败时重试。funcBoot(ctx,clientContext context.Context,d*DriverHandle,pw progress.Writer)(*client.Client,error){try:=0logger:=discardLoggerifpw!=nil{logger=pw.Write}for{info,err:=d.Info(ctx)// 查询驱动程序状态iferr!=nil{returnnil,err}try++ifinfo.Status!=Running{iftry>2{returnnil,errors.Errorf("failed to bootstrap %T driver in attempts",d)}// 如果未运行,则尝试引导启动iferr:=d.Bootstrap(ctx,logger);err!=nil{returnnil,err}}// 获取 BuildKit 客户端c,err:=d.Client(clientContext)iferr!=nil{iferrors.Is(err,ErrNotRunning{})&&try<=2{continue// 如果是未运行错误,且尝试次数未超,则重试循环}returnnil,err}returnc,nil}}

这些代码片段体现了 Buildx 项目的几个核心设计:模块化(通过驱动程序支持多种后端)、声明式配置(通过 Bake 和 HCL)以及对 BuildKit 所有功能的充分利用。
9sS2xK9ahqK2nmJ3CUBl9PAdseQ0eJ/iRg/0n3QGCFI=
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1133695.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

B站Hi-Res音频下载终极指南:从入门到精通的完整教程

B站Hi-Res音频下载终极指南&#xff1a;从入门到精通的完整教程 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirrors/bi/…

懒人专属:一键部署Z-Image-Turbo的终极方案

懒人专属&#xff1a;一键部署Z-Image-Turbo的终极方案 作为一名大学生&#xff0c;期末项目需要使用AI图像生成模型&#xff0c;但学校的计算资源有限&#xff0c;个人笔记本性能又不足。这时候&#xff0c;Z-Image-Turbo镜像就能成为你的救星。这款由阿里巴巴开源的图像生成模…

Manga OCR 终极指南:快速掌握日语漫画文本识别技术

Manga OCR 终极指南&#xff1a;快速掌握日语漫画文本识别技术 【免费下载链接】manga-ocr Optical character recognition for Japanese text, with the main focus being Japanese manga 项目地址: https://gitcode.com/gh_mirrors/ma/manga-ocr 想要轻松识别日语漫画…

计算机毕设java大学生创新项目申报系统 基于Java的大学生创新创业项目申报平台开发 Java技术驱动的大学生创新项目申报管理系统设计

计算机毕设java大学生创新项目申报系统25q799&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着时代的发展&#xff0c;大学生创新创业项目愈发受到重视&#xff0c;成为推动社…

终极指南:如何在Windows 10/11中无缝访问Linux EXT4分区 - Ext2Read完全教程

终极指南&#xff1a;如何在Windows 10/11中无缝访问Linux EXT4分区 - Ext2Read完全教程 【免费下载链接】ext2read A Windows Application to read and copy Ext2/Ext3/Ext4 (With LVM) Partitions from Windows. 项目地址: https://gitcode.com/gh_mirrors/ex/ext2read …

iOS钉钉自动打卡神器:告别迟到焦虑的终极解决方案

iOS钉钉自动打卡神器&#xff1a;告别迟到焦虑的终极解决方案 【免费下载链接】dingtalk_check_in 钉钉早上自动打卡 &#x1f602; &#x1f602; &#x1f602; 项目地址: https://gitcode.com/gh_mirrors/di/dingtalk_check_in 还在为每天早上的打卡焦虑而烦恼吗&…

M3U8下载器:轻松保存在线视频的终极解决方案

M3U8下载器&#xff1a;轻松保存在线视频的终极解决方案 【免费下载链接】m3u8-downloader 一个M3U8 视频下载(M3U8 downloader)工具。跨平台: 提供windows、linux、mac三大平台可执行文件,方便直接使用。 项目地址: https://gitcode.com/gh_mirrors/m3u8d/m3u8-downloader …

AMD显卡运行CUDA应用终极指南:5分钟快速上手ZLUDA

AMD显卡运行CUDA应用终极指南&#xff1a;5分钟快速上手ZLUDA 【免费下载链接】ZLUDA CUDA on AMD GPUs 项目地址: https://gitcode.com/gh_mirrors/zlu/ZLUDA 想要在AMD显卡上体验原本专为NVIDIA设计的CUDA应用吗&#xff1f;ZLUDA项目为你打开了一扇全新的大门。作为一…

群晖DSM 7.2.2系统Video Station技术部署指南

群晖DSM 7.2.2系统Video Station技术部署指南 【免费下载链接】Video_Station_for_DSM_722 Script to install Video Station in DSM 7.2.2 项目地址: https://gitcode.com/gh_mirrors/vi/Video_Station_for_DSM_722 DSM 7.2.2系统升级后&#xff0c;许多用户发现套件中…

Z-Image-Turbo性能优化实战:多卡并行推理加速技巧

Z-Image-Turbo性能优化实战&#xff1a;多卡并行推理加速技巧 当AI公司的技术团队发现单卡推理速度无法满足业务需求时&#xff0c;如何利用多GPU并行计算提升Z-Image-Turbo的生成效率成为关键问题。本文将分享一套经过实战验证的多卡并行推理加速方案&#xff0c;帮助你在现有…

懒人必备:一键部署阿里通义Z-Image-Turbo的云端解决方案

懒人必备&#xff1a;一键部署阿里通义Z-Image-Turbo的云端解决方案 对于小型设计工作室来说&#xff0c;AI辅助创作已经成为提升效率的利器。但团队成员电脑配置参差不齐&#xff0c;本地部署AI模型往往面临依赖复杂、显存不足等问题。阿里通义Z-Image-Turbo作为一款高性能图像…

教育机构特供:机房环境下批量部署阿里通义方案

教育机构特供&#xff1a;机房环境下批量部署阿里通义方案 在职业培训学校开设AI艺术课程时&#xff0c;IT管理员常面临数十台机房电脑环境统一部署的挑战。本文将介绍如何通过阿里通义方案实现快速批量部署&#xff0c;解决依赖复杂、配置繁琐的痛点。这类任务通常需要GPU环境…

B站视频下载神器:BilibiliDown使用全攻略

B站视频下载神器&#xff1a;BilibiliDown使用全攻略 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirrors/bi/BilibiliDo…

M3U8视频下载完整教程:从入门到精通快速掌握

M3U8视频下载完整教程&#xff1a;从入门到精通快速掌握 【免费下载链接】m3u8-downloader 一个M3U8 视频下载(M3U8 downloader)工具。跨平台: 提供windows、linux、mac三大平台可执行文件,方便直接使用。 项目地址: https://gitcode.com/gh_mirrors/m3u8d/m3u8-downloader …

Z-Image-Turbo模型安全:快速构建隔离测试环境

Z-Image-Turbo模型安全&#xff1a;快速构建隔离测试环境 作为一名安全工程师&#xff0c;我最近需要评估Z-Image-Turbo在企业环境中的潜在安全风险&#xff0c;但又不能影响生产系统。经过实践&#xff0c;我发现通过快速部署隔离测试环境是最稳妥的方案。本文将分享如何利用预…

故障排除指南:阿里通义WebUI常见问题一站式解决

故障排除指南&#xff1a;阿里通义WebUI常见问题一站式解决 作为一名刚接触AI绘画的新手&#xff0c;我在使用阿里通义WebUI时遇到了各种报错信息&#xff0c;社区里的解决方案五花八门&#xff0c;让人摸不着头脑。经过多次实践和总结&#xff0c;我整理了一份系统性的问题排查…

3个神技搞定Zotero期刊缩写:懒人专属高效秘籍

3个神技搞定Zotero期刊缩写&#xff1a;懒人专属高效秘籍 【免费下载链接】zotero-format-metadata Linter for Zotero. An addon for Zotero to format item metadata. Shortcut to set title rich text; set journal abbreviations, university places, and item languages, …

PPTist在线演示工具:重新定义浏览器中的PPT创作体验

PPTist在线演示工具&#xff1a;重新定义浏览器中的PPT创作体验 【免费下载链接】PPTist 基于 Vue3.x TypeScript 的在线演示文稿&#xff08;幻灯片&#xff09;应用&#xff0c;还原了大部分 Office PowerPoint 常用功能&#xff0c;实现在线PPT的编辑、演示。支持导出PPT文…

iOS钉钉自动打卡终极解决方案 - 告别迟到烦恼的完整指南

iOS钉钉自动打卡终极解决方案 - 告别迟到烦恼的完整指南 【免费下载链接】dingtalk_check_in 钉钉早上自动打卡 &#x1f602; &#x1f602; &#x1f602; 项目地址: https://gitcode.com/gh_mirrors/di/dingtalk_check_in 还在为每天早上的打卡焦虑而困扰吗&#xff…

AI绘画版权无忧:基于阿里通义Z-Image-Turbo的合规商用方案

AI绘画版权无忧&#xff1a;基于阿里通义Z-Image-Turbo的合规商用方案 作为一名自由设计师&#xff0c;你是否也像Lisa一样&#xff0c;既想借助AI绘画工具提升创作效率&#xff0c;又担心生成作品的版权问题&#xff1f;本文将介绍如何通过阿里通义Z-Image-Turbo镜像&#xff…