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
相关产品推荐
相关产品推荐

