【发布时间】:2021-07-17 18:08:02
【问题描述】:
我们正在将我们的 DevOps 管道移动到一个新的集群中,在此期间,我们在使用 PowerShell 调用 kind 时遇到了一个奇怪的行为。这也适用于kubectl。
以下内容应仅作为重现,而不是真实世界的应用程序。换句话说,我不想修复下面的代码,但我正在寻找错误发生的原因:
curl.exe -Lo kind-windows-amd64.exe https://kind.sigs.k8s.io/dl/v0.10.0/kind-windows-amd64
Move-Item .\kind-windows-amd64.exe c:\temp\kind.exe -Force
$job = Start-Job -ScriptBlock { iex "$args" } -ArgumentList c:\temp\kind.exe, get, clusters
$job | Receive-Job -Wait -AutoRemoveJob
现在,如果我在 PowerShell 窗口中直接执行c:\temp\kind.exe get clusters 命令,就不会出现错误:
换句话说,为什么PowerShell(任何版本)将kind/kubectl 的STDOUT 视为STDERR?我怎样才能防止这种情况发生?
它必须有一个环境因素,因为相同的确切代码在一个系统中运行良好,而在另一个系统中它会引发错误......
【问题讨论】:
-
来自
kind.exe的No kind clusters found在两个描述的调用中都在STDERR中。尝试以2>NUL c:\temp\kind.exe get clusters的身份从打开的cmd.exe窗口 运行后者。它只是没有颜色...... -
@JosefZ 我不明白。为什么
kind产生STDERR几乎任何东西?我的意思是,当我创建带有消息Creating cluster "kind" ...的集群以及删除带有错误消息Deleting cluster "kind" ...的集群时,我会收到来自PowerShell的红色错误消息和堆栈跟踪。当然这些应该是STDOUT,不是吗?每次打电话给kind时,我真的需要2>&1吗? -
我认为这符合预期,因为
kind将在STDERR上输出所有内容。您是否考虑过忽略这些消息并使用-q/--quiet-silence all stderr output运行kind?我认为您也可以在kindgithub 页面上获取更多参考:github.com/kubernetes-sigs/kind -
@DawidKruk 好吧,我已经编写了一个 PowerShell 模块来处理这种情况。总而言之,PowerShell 错误处理似乎有点混乱:github.com/MicrosoftDocs/PowerShell-Docs/issues/1583
-
@JaniHyytiäinen 很高兴您找到了解决方案。我鼓励您使用您创建的模块发布答案,以便社区将来可以从中受益。
标签: powershell stdout kubectl stderr kind