Docker buildx 编译多平台镜像

623 阅读1分钟

安装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 []
...