不使用buildx时docker build构建arm64镜像输出amd64如何解决?
问题原因
你在amd64架构主机上执行构建时,Docker默认拉取与宿主架构匹配的amd64版基础镜像,镜像的架构元数据直接继承自基础镜像。你在Go编译阶段指定的GOARCH=arm64仅影响编译出的二进制文件架构,不会修改镜像本身的架构标识,所以最终校验时会得到Architecture为amd64的结果。
解决方案
以下方案均无需使用buildx,适配你需要安装特定架构工具的场景:
方案1:修改Dockerfile指定基础镜像平台(最推荐)
直接在FROM指令中声明基础镜像的目标架构,无需修改构建命令,构建出的镜像会自动继承arm64架构标识:
修改arm64/Dockerfile的FROM行:
# syntax=docker/dockerfile:1 # Download arm64 specifict tools # 仅修改这一行即可 FROM --platform=linux/arm64 golang:1.17.2 as build WORKDIR /source COPY src/go.mod ./ COPY src/go.sum ./ RUN go mod download COPY src/ ./ RUN env GOOS=linux GOARCH=arm64 go build -o /app
如果构建过程中RUN指令执行报错,是因为amd64主机运行arm64二进制需要QEMU模拟,安装对应依赖即可:
apt install qemu-user-static
方案2:构建命令添加平台参数
无需修改Dockerfile,在docker build命令中指定目标平台即可,依赖Docker 18.09及以上版本默认开启的BuildKit能力:
docker build \ --platform linux/arm64 \ --target build -t $CURRENT_REGISTRY/mycontainer:arm64 \ -f ./docker/$ARCH/Dockerfile .
方案3:手动修改镜像架构元数据
如果你完全不想启用架构模拟功能,可以在原有构建完成后,手动修改镜像的架构标识:
# 先完成原有构建流程 # 创建manifest并修改架构属性 docker manifest create $CURRENT_REGISTRY/mycontainer:arm64 \ --amend $CURRENT_REGISTRY/mycontainer:arm64 docker manifest annotate --arch arm64 --os linux \ $CURRENT_REGISTRY/mycontainer:arm64 $CURRENT_REGISTRY/mycontainer:arm64 # 推送到镜像仓库后生效 docker manifest push $CURRENT_REGISTRY/mycontainer:arm64
内容的提问来源于stack exchange,提问作者Chris G.
相关产品推荐
相关产品推荐

