多平台构建时如何在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提前解析变量:
或者在Dockerfile中给镜像名加双引号:docker build -f Dockerfile --platform=windows/amd64 -t project:latest .FROM "image-${TARGETOS}" - CMD命令提示符:使用
%TARGETOS%语法,但这种方式仅适用于Windows,不推荐跨平台场景使用。
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

