Azure 批处理 windows 容器工作负载从提供的命令行中删除引号
Azure batch windows container workloads remove quotes from provided command line
在 Azure Batch 上使用 windows 容器工作负载时,如果引用不包含 space.
,则会从命令行参数中删除它们
我们正在使用最新的 C# SDK 13.0.0 和节点虚拟机 SKU windows 服务器 2019 和容器。
重现:
在 docker 容器内创建作业和任务 运行(例如,基于 docker 图像 mcr.microsoft.com/windows/servercore:ltsc2019)
使用 cmd /S /C mkdir "c:/foo"
的命令行 - 看到在 docker 容器内命令被执行为 cmd /S /C mkdir c:/foo
- 这将失败。
此开放容器 PR 中描述了相同的问题:https://github.com/opencontainers/runtime-spec/commit/deb4d954eafc4fc65f04c00a08e08c3e69df32d0
编辑:我意识到这与其说是一个问题,不如说是一个陈述...所以问题是:
此行为的 workaround/fix 是什么?
编辑 powershell -EncodedCommand 解决方案:
我接受了环境变量解决方案,但我们使用的是不同的解决方案。
我们使用“https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_powershell_exe?view=powershell-5.1#-encodedcommand-base64encodedcommand
” - 这样做隐藏了 CommandLineToArgsvW 和 docker 中的引号和反斜杠 - 这意味着命令行在 azure batch vm 的 docker 容器中正确地放在一起。 (在 C# 中,这是由 var base64EncodedCmd = System.Convert.ToBase64String(System.Text.Encoding.Unicode.GetBytes(cmd));
完成的)注意正确地转义 powershell。例如编码的命令可以是 "& my.exe --% --input \\"userprovidedparam\""
之类的东西(使用 powershells“停止解析”--%),否则例如将评估 $(Get-Date) 的值
鉴于这是 运行time 的一个问题,一个可能的解决方法是创建一个 .cmd
或 .bat
文件,其中包含您想要 运行.您可以将此文件关联为 ResourceFile 或将其烘焙到自定义容器中。
在 Azure Batch 上使用 windows 容器工作负载时,如果引用不包含 space.
,则会从命令行参数中删除它们我们正在使用最新的 C# SDK 13.0.0 和节点虚拟机 SKU windows 服务器 2019 和容器。
重现:
在 docker 容器内创建作业和任务 运行(例如,基于 docker 图像 mcr.microsoft.com/windows/servercore:ltsc2019)
使用 cmd /S /C mkdir "c:/foo"
的命令行 - 看到在 docker 容器内命令被执行为 cmd /S /C mkdir c:/foo
- 这将失败。
此开放容器 PR 中描述了相同的问题:https://github.com/opencontainers/runtime-spec/commit/deb4d954eafc4fc65f04c00a08e08c3e69df32d0
编辑:我意识到这与其说是一个问题,不如说是一个陈述...所以问题是: 此行为的 workaround/fix 是什么?
编辑 powershell -EncodedCommand 解决方案:
我接受了环境变量解决方案,但我们使用的是不同的解决方案。
我们使用“https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_powershell_exe?view=powershell-5.1#-encodedcommand-base64encodedcommand
” - 这样做隐藏了 CommandLineToArgsvW 和 docker 中的引号和反斜杠 - 这意味着命令行在 azure batch vm 的 docker 容器中正确地放在一起。 (在 C# 中,这是由 var base64EncodedCmd = System.Convert.ToBase64String(System.Text.Encoding.Unicode.GetBytes(cmd));
完成的)注意正确地转义 powershell。例如编码的命令可以是 "& my.exe --% --input \\"userprovidedparam\""
之类的东西(使用 powershells“停止解析”--%),否则例如将评估 $(Get-Date) 的值
鉴于这是 运行time 的一个问题,一个可能的解决方法是创建一个 .cmd
或 .bat
文件,其中包含您想要 运行.您可以将此文件关联为 ResourceFile 或将其烘焙到自定义容器中。