咨询:PowerShell如何实现不回传日志的内联控制台日志输出
实现PowerShell内联控制台日志不回传宿主的解决方案
这个问题的核心在于PowerShell的输出流机制,以及Docker exec会默认将容器内进程的所有输出(包括日志类输出)传回宿主进程。要让Script2的日志只在容器控制台打印,不被Script1捕获,有以下几种可行方案:
方案一:直接写入容器控制台设备
避免使用Write-Host(其输出会被PowerShell路由到信息流,最终被Docker传回宿主),改用直接调用.NET的控制台写入方法,绕过PowerShell的流处理,直接将日志输出到容器的物理控制台:
针对Linux容器的Script2修改:
function FromScript2 (name){ # 直接写入容器控制台,不会被Docker exec传回宿主 [Console]::WriteLine("method-called") # 如果需要向Script1返回业务数据,使用return # return "processed-result-for-script1" }
针对Windows容器的Script2修改:
function FromScript2 (name){ [Console]::WriteLine("method-called") # 也可以用Out-File指向Windows控制台设备 # "method-called" | Out-File \\.\CON }
方案二:重定向信息流到容器控制台
如果你不想修改Write-Host的写法,可以在Script1调用时,将Script2的信息流(Write-Host默认输出到流6)重定向到容器的控制台设备,不让其进入Docker exec的返回流:
Linux容器下的Script1修改:
$output = ExecutePS2InDocker -command "FromScript2 $(varName) 6>&1 | Out-File /dev/console"
Windows容器下的Script1修改:
$output = ExecutePS2InDocker -command "FromScript2 $(varName) 6>&1 | Out-File \\.\CON"
原理说明
- PowerShell中
Write-Host在v5及以上版本会将输出发送到信息流(Stream 6),默认情况下这个流会被重定向到标准输出(stdout),而Docker exec会将容器内进程的stdout/stderr全部传回宿主,导致Script1的$output捕获到日志内容。 - 直接写入控制台设备或重定向信息流到控制台设备,会让日志仅在容器的本地控制台显示,不进入Docker的输出管道,从而避免被Script1捕获。
内容的提问来源于stack exchange,提问作者randy107
相关产品推荐
相关产品推荐

