使用buildx工具构建多平台镜像
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 .