安装docker
这里就不展开描述了 如果你安装的是docker-desktop,自带会有这个docker 相关命令以及buildx的cli
创建一个buildx 上下文
# 查看当前buildx 上下文列表
$ docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS BUILDKIT PLATFORMS
default * docker
default default running 20.10.23 linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
desktop-linux docker
desktop-linux desktop-linux running 20.10.23 linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
# 创建一个buildx 上下文 并使用
$ docker buildx create --name mybuildx --use
# 查看这个上下文内容
$ docker buildx inspect mybuildx
Name: mybuildx
Driver: docker-container
Last Activity: 2023-04-10 08:26:21 +0000 UTC
Nodes:
Name: mybuildx0
Endpoint: unix:///var/run/docker.sock
Status: running
Buildkit: v0.9.3
Platforms: linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
开始构建多平台支持镜像
这里注意,构建出来如果没有push的地址,则编译出来的镜像只是在cache中,也不在本地的image list里面
# 比如这个就没有push到 docker hub 上去
$ docker buildx build --platform linux/arm64,linux/amd64 -t charlotteliu/demo:latest .
WARNING: No output specified with docker-container driver. Build result will only remain in the build cache. To push result
不推荐: 只想保存在本地, 但是一次构建一种平台的镜像
# 构建一种架构的镜像到本地
$ docker buildx build -t --platform=linux/arm64 -o charlotteliu/demo type=docker .
$ docker buildx build -t --platform=linux/amd64 -o charlotteliu/demo type=docker .
推荐: 推送到dockerhub 可以同时编译多个平台镜像并推送
# 需要先docker login, 这里就不详细说明怎么使用docker login了
$ docker login
# 这样子编译完成后就直接push到 docker hub 上去了
docker buildx build --push --platform linux/arm64,linux/amd64 -t charlotteliu/demo:latest .
一些特殊处理
如果你的docker 镜像中一些依赖组件需要依赖的平台环境也不相同,这时候需要进行一些特殊处理 这里是一些预先定义好的变量 官方文档链接地址
# 在dockerfile中定义一个变量,让docker buildx 传递进来编译的平台环境
# 这里的amd64提供一个默认值
ARG TARGETARCH=amd64
# 这里使用TARGETARCH 变量
RUN curl \
--location \
--output /opt/tmp.zip \
https://your-host/url/query${TARGETARCH}.zip \
&& unzip /opt/tmp.zip -d /usr/local/bin \
&& rm -rf /opt/tmp.zip
CMD []
...