Docker Buildx插件

Overview

Docker Buildx是一个CLI插件,它扩展了Docker命令,完全支持Moby BuildKit builder toolkit提供的功能。它提供了与docker build相同的用户体验,并提供了许多新功能,如创建作用域生成器实例和针对多个节点并发构建。

安装

Docker Buildx包含在Docker 19.03中,并与以下Docker Desktop版本捆绑在一起。请注意,必须启用“实验特性”选项才能使用Docker Buildx。

  • Docker Desktop Enterprise version 2.1.0
  • Docker Desktop Edge version 2.0.4.0 or higher

还可以从Docker buildx存储库下载最新的buildx二进制文件。

Build with buildx

To start a new build, run the command docker buildx build .

$ docker buildx build .

[+] Building 8.4s (23/32)

=> ...

Buildx使用BuildKit引擎生成,并且不需要DOCKER_BuildKit=1环境变量来启动生成。

docker buildx build命令支持docker build可用的功能,包括docker 19.03中的新功能,如输出配置、内联构建缓存和指定目标平台。此外,Buildx还支持常规docker构建尚不可用的新功能,如构建清单列表、分布式缓存和将构建结果导出到OCI映像tarballs。

可以在通过驱动程序概念公开的不同配置中运行Buildx。目前,Docker支持一个“Docker”驱动程序,该驱动程序使用绑定到Docker守护程序二进制文件中的BuildKit库,以及一个“Docker容器”驱动程序,该驱动程序在Docker容器中自动启动BuildKit。

不同驱动程序使用Buildx的用户体验非常相似。但是,有一些特性目前不受“docker”驱动程序的支持,因为绑定到docker后台程序中的BuildKit库使用不同的存储组件。相反,默认情况下,使用“docker”驱动程序生成的所有图像都会自动添加到“docker images”视图中,而在使用其他驱动程序时,需要使用--output选择输出图像的方法。

使用生成器实例

默认情况下,如果支持的话,Buildx使用“docker”驱动程序,提供的用户体验与本机docker构建非常相似。请注意,必须使用本地共享守护程序来构建应用程序。

Buildx允许创建独立构建器的新实例。可以使用它来为CI构建获取一个作用域环境,该环境不会更改共享守护程序的状态,或者用于隔离不同项目的生成。可以为一组远程节点创建一个新实例,形成一个构建场,并在它们之间快速切换。

可以使用docker buildx create命令创建新实例。这将基于当前的配置创建一个新的构建器实例,其中包含一个节点。

要使用远程节点,可以在创建新生成器时指定DOCKER_HOST或远程上下文名称。创建新实例后,可以使用inspect、stop和rm命令管理其生命周期。要列出所有可用的生成器,请使用ls。在创建一个新的构建器之后,还可以向它添加新的节点。

要在不同的构建器之间切换,请使用docker buildx use<name>。运行此命令后,生成命令将自动使用此生成器。

Docker 19.03还提供了一个新的Docker context命令,可以使用该命令为远程Docker API端点提供名称。Buildx与docker context集成,确保所有上下文自动获得一个默认的builder实例。也可以在创建新的生成器实例或向其中添加节点时将上下文名称设置为目标。

构建多平台镜像

BuildKit被设计成可以很好地为多个平台进行构建,而不仅仅适用于调用构建的用户不经常运行的体系结构和操作系统。

调用构建时,可以设置--platform标志以指定生成输出的目标平台(例如,linux/amd64、linux/arm64、darwin/amd64)。

当当前builder实例由“docker container”驱动程序支持时,可以一起指定多个平台。在本例中,它构建一个清单列表,其中包含所有指定架构的映像。当在docker run或docker service中使用此映像时,docker会根据节点的平台选择正确的映像。

可以使用Buildx和Dockerfiles支持的三种不同策略构建多平台映像:

在内核中使用QEMU仿真支持

使用同一生成器实例在多个本机节点上构建

使用Dockerfile中的stage交叉编译到不同的架构

如果节点已经支持QEMU,那么QEMU是最简单的开始方法(例如。如果使用的是Docker Desktop)。它不需要更改Dockerfile,BuildKit会自动检测可用的辅助架构。当BuildKit需要为不同的体系结构运行一个二进制文件时,它会通过binfmt_misc处理程序中注册的二进制文件自动加载它。

使用多个本机节点可以更好地支持QEMU无法处理的更复杂的情况,并且通常具有更好的性能。可以使用--append标志向构建器实例添加其他节点。

# assuming contexts node-amd64 and node-arm64 exist in "docker context ls"

$ docker buildx create --use --name mybuild node-amd64

mybuild

$ docker buildx create --append --name mybuild node-arm64

$ docker buildx build --platform linux/amd64,linux/arm64 .

最后,根据您的项目,使用的语言可能对交叉编译有很好的支持。在这种情况下,Dockerfiles中的多阶段构建可以有效地用于使用--platform指定的平台,使用构建节点的本机架构来构建二进制文件。BUILDPLATFORM和TARGETPLATFORM等构建参数列表在Dockerfile中自动提供,并可供作为构建的一部分运行的进程使用。

FROM --platform=$BUILDPLATFORM golang:alpine AS build

ARG TARGETPLATFORM

ARG BUILDPLATFORM

RUN echo "I am running on $BUILDPLATFORM, building for $TARGETPLATFORM" > /log

FROM alpine

COPY --from=build /log /log

高级生成选项

Buildx还旨在为高级构建概念提供支持,这些概念不仅仅是调用单个构建命令。

BuildKit高效地处理多个并发生成请求和重复数据消除工作。构建命令可以与通用命令运行器(例如make)结合使用。但是,这些工具通常按顺序调用构建,因此不能充分利用BuildKit并行化的潜力,也不能为用户组合BuildKit的输出。对于这个用例,添加了一个名为docker buildx bake的命令。

bake命令支持从合成文件构建图像,类似于合成构建,但允许将所有服务作为单个请求的一部分同时构建。

将buildx设置为默认生成器

运行命令docker buildx install将docker buildx命令设置为docker buildx的通假名。这使得docker build能够使用当前buildx builder。

要删除此通假名,请运行docker buildx uninstall。

Docker Buildx插件的更多相关文章

  1. Docker Buildx使用教程:使用Buildx构建多平台镜像

    写在前边 记录一下前阵子在X86_64平台使用Docker Buildx构建多平台镜像的办法,包含但不限于构建ARM镜像. 构建环境 软件名 版本 Ubuntu 18.04.2 LTS Docker ...

  2. 使用docker buildx打包发布多平台镜像

    2022-07-07 个人比较喜欢影视作品,下载了大量的剧集视频,有些文件的命名不规范,就需要重新命名,之前是用的一款 renamer 客户端软件,用起来不太爽就自己做了个 bs 架构的重命名软件并开 ...

  3. Docker 的插件式设计

    http://www.tuicool.com/articles/MnIRZvJ http://uzhima.com/2016/08/02/what-is-docker-volume-plugin/ 在 ...

  4. 使用Docker Maven 插件进行镜像的创建以及上传至私服

    1.在进行服务容器化部署的时候,需要将服务以及其运行的环境整个打包做成一个镜像,打包的过程有两种办法,第一种是首选通过maven打成jar包,然后再编写dockerfile,执行docker buil ...

  5. Docker for Mac与IntelliJ Docker Integration插件的兼容性问题

    笔者在自己的Mac上安装的是Docker for Mac,而不是Docker Toolbox. 这两者最主要的区别在于Docker for Mac用HyperKit作为虚拟化解决方案而不是Virtua ...

  6. docker——libnetwork插件网络功能

    从1.7.0版本开始,Docker正是把网络和存储这两部分的功能都以插件化形式剥离出来,允许用户通过指令来选择不同的后端实现.剥离出来的独立容器网络项目叫libnetwork,从名字就能看出,它希望将 ...

  7. 使用docker Maven插件本地构建docker镜像并发布到远程服务器

    1.登录网站https://start.spring.io/,生成一个基本的SpringBoot应用. 2.将应用导入Eclipse IDE并创建Application类.目录结构如下: Applic ...

  8. idea设置docker远程插件

    简介 docker都是通过命令来操作容器,使用idea插件可以减少重复命令输入等. 使用步骤 Idea内安装插件 打开Idea,Preferences | Plugins 进入插件安装界面,在搜索框中 ...

  9. docker jenkins 插件安装提速

    公司安装的jenkins 自动布署服务挂了,好像有漏洞一直搞,打算重新安装一个,随便再学习一下 一上来就用docker 解决问题 #!/bin/bash docker stop myjenkins d ...

随机推荐

  1. hdu4772 水模拟

    题意:       给你两个矩阵,问你两个矩阵的最大相同元素个数(位置也要求相同),矩阵可以90旋转多次. 思路:       水题,直接模拟就行了,方法很多,可以直接写坐标关系,或者一层一层处理,就 ...

  2. Python小程序 -- 人民币小写转大写辅助工具

    大家应该都知道,银行打印账单有时候会跟上人民币的阿拉伯数字以及人民币汉字大写写法,转换的过程中有一定的逻辑难度,较为麻烦,所以笔者心血来潮,花了点时间简单实现了一下这一转换过程,以供初学者参考. 输入 ...

  3. LA3635派

    题意:       有F+1个人来分n个圆形派,每个人分到的必须是一个整块的派,形状无所谓,每个人分到的必须一样多,给你每个派的半径,问每个人能分到的最大派的面积是多少. 思路:       虽然不是 ...

  4. JVM默认内存大小

    堆(Heap)和非堆(Non-heap)内存 按照官方的说法:"Java虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配.堆是在Java虚拟机启动时创建的." ...

  5. 安装和简单使用apidoc

    安装nodejs 参考链接 安装apidoc 参考链接 使用 https://www.bilibili.com/video/BV1MW411Q7g4 https://www.bilibili.com/ ...

  6. Docker 搭建一个多端同步网盘-Nextcloud

    hub 官网

  7. 没有发生GC也进入了安全点?这段关于安全点的JVM源码有点意思!

    文末 JVM 思维导图,有需要的可以自取 熟知并发编程的你认为下面这段代码的执行结果是怎么样的? 我如果说,执行流程是: t1 线程和 t2 线程一直执行 num 的累加操作 主线程睡眠 1 秒,1 ...

  8. Codeforces Round #660 (Div. 2)

    A. Captain Flint and Crew Recruitment 题意:定义了一种数(接近质数),这种数可以写成p*q并且p和q都是素数,问n是否可以写成四个不同的数的和,并且保证至少三个数 ...

  9. 04.06 UCF Local Programming Contest 2017

    A.Electric Bill 题意:简单计算题,超过1000部分额外算 1 #include<stdio.h> 2 int main(){ 3 int money1,money2; 4 ...

  10. Kubernetes入门,使用minikube 搭建本地k8s 环境

    这是一篇 K8S 的 HelloWorld,在学习K8S官方文档时搭建环境搭建的一个记录,照着文档下来还是比较顺利的. 一.安装kubectl 下载 kubectl curl -LO "ht ...