You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不使用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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 18:36:01