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

多平台构建时如何在Dockerfile中获取TARGETOS的值?

问题(中文翻译)

我想在Dockerfile中获取当前构建镜像对应的目标操作系统。根据Docker官方文档,构建参数会自动在Dockerfile中可用,于是我在Dockerfile里添加了以下内容:

FROM --platform=$BUILDPLATFORM golang:alpine AS build
# ...
FROM image-${TARGETOS}

但在Windows平台执行构建时出现了如下错误:

failed to parse platform : "" is an invalid component of "": platform specifier component must match "^[A-Za-z0-9_-]+$": invalid argument

请问怎么在Linux和Windows系统中正确获取目标操作系统的值?我使用的构建命令如下:

docker build -f Dockerfile --platform=windows/amd64 -t project:latest .

或者:

docker build -f Dockerfile --platform=linux/amd64 -t project:latest .

解决方案

1. 显式声明ARG变量(跨平台通用)

问题根源是不同宿主系统的shell对变量的解析逻辑冲突:Linux Shell用$VAR,但Windows的CMD/PowerShell会优先尝试解析$TARGETOS,找不到对应变量就会替换为空值,导致Docker收到无效的平台参数。

在Dockerfile开头显式声明TARGETOS和BUILDPLATFORM这两个Docker自动注入的参数,即可跳过宿主shell的变量解析,直接使用Docker提供的值:

ARG BUILDPLATFORM
ARG TARGETOS

FROM --platform=$BUILDPLATFORM golang:alpine AS build
# ... 你的构建步骤 ...

FROM image-${TARGETOS}
# ... 后续镜像构建步骤 ...

2. 验证变量有效性

可以在构建阶段添加打印命令,确认TARGETOS是否被正确注入:

ARG BUILDPLATFORM
ARG TARGETOS

FROM --platform=$BUILDPLATFORM golang:alpine AS build
RUN echo "当前目标操作系统:$TARGETOS"
# ... 其他构建逻辑 ...

3. Windows Shell适配(可选)

如果不想修改Dockerfile,可针对Windows的不同shell调整变量传递方式:

  • PowerShell:用单引号包裹镜像名,避免PowerShell提前解析变量:
    docker build -f Dockerfile --platform=windows/amd64 -t project:latest .
    
    或者在Dockerfile中给镜像名加双引号:
    FROM "image-${TARGETOS}"
    
  • CMD命令提示符:使用%TARGETOS%语法,但这种方式仅适用于Windows,不推荐跨平台场景使用。

内容的提问来源于stack exchange,提问作者Jay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 17:42:14