首页/云/Docker 容器速查/FROM --platform 多架构构建选择
镜像与构建107 条

FROM --platform 多架构构建选择

配合 BuildKit 的预定义变量选择构建与目标平台:编译阶段跑本机架构(BUILDPLATFORM),产出目标架构(TARGETPLATFORM)的二进制。

Docker 容器速查云更新于 2026-10-13

FROM --platform 是什么

在 Dockerfile 里给 FROM 指定 --platform,可以显式声明该阶段使用的镜像架构。配合 BuildKit 预定义变量,就能写出「编译阶段跑构建机架构、产出目标架构」的标准多架构构建模式:编译类任务在原生架构上高速执行,最终运行阶段用目标架构镜像,产物无需模拟运行。这些变量由 BuildKit 按目标平台注入,老版本构建器不提供。

基本信息

预定义变量BUILDPLATFORM、BUILDOS、BUILDARCH、TARGETPLATFORM、TARGETOS、TARGETARCH、TARGETVARIANT
语法FROM --platform=$BUILDPLATFORM golang:1.23 AS build
声明要求变量必须在 FROM 之后用不带赋值的 ARG 重新声明才可用
依赖BuildKit:docker buildx 或 Docker 23+ 默认构建
配套参数构建命令用 --platform linux/amd64,linux/arm64 指定目标
固定写法FROM --platform=linux/amd64 也可写死,代价是失去可移植性

典型使用场景

  • Go、Rust 等交叉编译友好的语言:一次构建出多架构二进制
  • 前端构建阶段放在构建机架构上,只让运行阶段使用目标架构
  • 需要在多架构构建里按 TARGETARCH 选择不同的依赖包
  • 排查 exec format error:确认运行阶段用的镜像架构与目标节点一致
  • 固定某个阶段的平台做可复现构建,避免构建机架构漂移影响产物

交叉编译标准写法

交叉编译标准写法
# 第一行声明前端版本,保证 ARG 与 --platform 行为一致
# syntax=docker/dockerfile:1

# 编译阶段固定跑构建机架构,速度最快
FROM --platform=$BUILDPLATFORM golang:1.23 AS build
ARG TARGETOS TARGETARCH
WORKDIR /src
COPY . .
RUN GOOS=$TARGETOS GOARCH=$TARGETARCH go build -o /out/app .

# 运行阶段使用目标平台镜像
FROM alpine:3.20
COPY --from=build /out/app /usr/local/bin/app
ENTRYPOINT ["/app"]

变量含义对照

变量取值示例用在哪
BUILDPLATFORMlinux/amd64编译阶段镜像,取构建机架构
TARGETPLATFORMlinux/arm64运行阶段镜像,取目标架构
TARGETOSlinux设置 GOOS 等编译目标系统
TARGETARCHarm64设置 GOARCH 等编译目标架构
TARGETVARIANTv732 位 ARM 的变体标识
TARGETARCH 取值为 arm64 这类 Docker 架构名,与部分工具链使用的 aarch64 命名不同,需要转换时在构建脚本里做映射而不是直接拼接。
运行阶段若也要按目标平台切换基础镜像,可写 FROM --platform=$TARGETPLATFORM alpine:3.20;不显式指定时该阶段默认取目标平台,因此多数场景只给编译阶段加 --platform 即可。

易错点

  • 这些变量由 BuildKit 注入,老式构建器环境变量为空,交叉编译参数会静默取默认值构建出错误架构
  • TARGETOS/TARGETARCH 必须在 FROM 之后用 ARG 重新声明,写在 FROM 之前只有 FROM 行本身能用
  • 交叉编译与模拟运行别混淆:编译阶段用构建机架构提速,运行阶段才用目标架构镜像
  • 给运行阶段写死 --platform=linux/amd64 后,多架构构建仍在每个目标平台重复产出同一架构镜像,清单里出现架构与实际不符的条目

数据来源与参考

  • Docker 官方文档:Multi-platform builds / Build variables(docs.docker.com)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌