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

Windows Dockerfile中如何将ARG值传递给PowerShell执行的RUN命令

Windows Dockerfile 无法传递ARG/ENV到PowerShell RUN命令的解决方案

问题根因

  • ARG作用域错误:定义在FROM指令前的ARG属于全局构建参数,仅作用于FROM行本身,进入具体镜像阶段后自动失效,必须在阶段内重新声明才能使用。
  • 变量语法不匹配:%变量名%是CMD的变量读取语法,PowerShell不识别该写法,只会原样输出;PowerShell读取环境变量必须使用$env:变量名语法。
  • ENV赋值无有效取值:原Dockerfile的ENV声明在阶段内未重新声明ARG,读取的TEST_ARG是空值,因此ENV变量从定义开始就是空的,自然不会在镜像中持久化。

修正方案

修改后的Dockerfile如下:

ARG TEST_ARG=value_to_insert_in_debug_txt_file

FROM mcr.microsoft.com/dotnet/framework/aspnet:4.7.2-windowsservercore-ltsc2016

# 关键改动:阶段内重新声明ARG,继承全局ARG的取值
ARG TEST_ARG

# 此时TEST_ARG有有效值,ENV赋值正常生效,会持久化到构建完成的镜像中
ENV MyEnvVar ${TEST_ARG}
ENV MyEnvVar2 自定义固定测试值

SHELL ["powershell","-Command"]

RUN "\"baseline\" | Out-File c:\debug.txt"
# 方式1:Docker预替换,构建前直接把ARG值嵌入命令
RUN "\"${TEST_ARG}\" | Out-File c:\debug1.txt"
# 方式2:PowerShell运行时读取构建阶段的环境变量(ARG会自动注入到构建阶段环境)
RUN "\"$env:TEST_ARG\" | Out-File c:\debug2.txt"
# 测试ENV变量读取
RUN "\"$env:MyEnvVar\" | Out-File c:\debug3.txt"

使用原构建命令即可正常生效:

docker build -f testdockerfile --no-cache -t test-app --build-arg "TEST_ARG=value_to_insert_in_debug_txt_file"

验证效果

构建完成后启动容器,执行echo $env:MyEnvVar可正常输出对应值,执行set命令也能看到自定义的环境变量,所有debug文件都会写入预期内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 18:45:04