使用buildx工具构建多平台镜像

TOC

buildx工具

在平时我们使用docker build的时候,只会构建当前系统架构的镜像,当我们需要构建不同架构以及多个架构的镜像时我们则可以使用buildx工具,它是docker命令自带的命令工具,安装好docker就自带,无须单独安装。

命令语法和选项

命令参数详情查看:

docker buildx -h
-------------------------------------------------
Flag shorthand -h has been deprecated, use --help
Extended build capabilities with BuildKit

Usage:  docker buildx [OPTIONS] COMMAND

Extended build capabilities with BuildKit

Options:
      --builder string   Override the configured builder instance
  -D, --debug            Enable debug logging

Management Commands:
  imagetools  Commands to work on images in registry

Commands:
  bake        Build from a file
  build       Start a build
  create      Create a new builder instance
  dial-stdio  Proxy current stdio streams to builder instance
  du          Disk usage
  inspect     Inspect current builder instance
  ls          List builder instances
  prune       Remove build cache
  rm          Remove one or more builder instances
  stop        Stop builder instance
  use         Set the current builder instance
  version     Show buildx version information

Run 'docker buildx COMMAND --help' for more information on a command.

Experimental commands and flags are hidden. Set BUILDX_EXPERIMENTAL=1 to show them.

语法: docker buildx【选项】

  • bake:使用Bake文件,定义多个目标和环境变量构建一个或多个镜像。
  • build:启动一个新的构建任务。
  • create:创建一个新的构建实例。
  • dial-stdio:将当前的标准输入/输出流代理到构建实例。
  • du:显示构建缓存的磁盘使用情况。
  • inspect:显示当前构建实例的详细情况。
  • ls:列出所有构建实例。
  • prune:清理不再使用的构建缓存,释放磁盘空间。
  • rm:删除一个或多个构建实例。
  • stop:停止正在运行的构建实例。
  • use:切换当前使用的构建实例。
  • version:查看当前buildx版本。

使用buildx

★准备工作★

如果我们直接使用docker buildx进行构建镜像会出下以下报错:
ERROR: Multi-platform build is not supported for the docker driver. Switch to a different driver, or turn on the containerd image store, and try again. Learn more at https://docs.docker.com/go/build-multi-platform/

这个错误是因为你在使用 Docker 的 buildx 工具进行多平台 (Multi-platform) 构建时,当前 Docker 环境的驱动程序(driver)不支持多平台功能。
解决问题的方式就是:启动容器化的 BuildKit

注意:使用Docker Desktop和OrbStack的用户无须额外配置,默认支持docker-container驱动。

方法 1:切换到 docker-container 驱动

创建一个新的buildx实例,并切换到docker-container驱动

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

检查驱动详情并启动buildx驱动

docker buildx inspect mybuilder --bootstrap

出现Driver: docker-container则成功!

方法 2:启用容器化的 BuildKit

配置Docker守护进程启用 BuildKit

vim /etc/docker/daemon.json
----------------------------
{
  "features": {
    "buildkit": true
  } 
}

重启docker服务生效

systemctl restart docker

查看镜像和驱动详情

查看驱动列表:

myserver~# docker buildx ls
NAME/NODE        DRIVER/ENDPOINT                   STATUS    BUILDKIT   PLATFORMS
mybuilder        docker-container                                       
 \_ mybuilder0    \_ unix:///var/run/docker.sock   stopped              
default*         docker                                                 
 \_ default       \_ default                       running   v0.14.1    linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/amd64/v4, linux/386

查看驱动详情:

myserver~# docker buildx inspect
Name:          default
Driver:        docker
Last Activity: 2024-12-05 03:30:07 +0000 UTC

Nodes:
Name:             default
Endpoint:         default
Status:           running
BuildKit version: v0.14.1
Platforms:        linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/amd64/v4, linux/386
Labels:
 org.mobyproject.buildkit.worker.moby.host-gateway-ip: 172.17.0.1

查看其他驱动后面直接跟驱动的Name即可
查看本地镜像支持的平台(platform)

docker inspect <image-name>:<tag> |grep Architecture

查看远程仓库中镜像支持的平台(platform)

docker buildx imagetools inspect <image-name>:<tag>

构建多架构平台镜像

构建多平台镜像只需要使用buildx build后面加上–platform linux/amd64,linux/arm64即可。

docker buildx build --platform linux/amd64,linux/arm64 -t <registry-name>/<project-name>/nginx-web:latest --push .

注意:当你需要构建多平台的时候后面只能加上–push,因为当前使用–platform指向了多个平台架构的构建,镜像也是生成的多架构的镜像。–load会有限制,不支持加载多平台镜像,所以用其他的会报错。

arm架构上构建amd架构镜像

构建amd架构镜像并加载到本地

docker buildx build --platform linux/amd64 -t nginx-web-amd:latest --load .

构建amd架构镜像并导成文件到本地

docker buildx build --platform linux/amd64 -t nginx-web-amd:latest --output type=docker,dest=./nginx-web-amd-late
st.img .