У меня есть сценарий PowerShell, который выполняет kubetctl / o c (o c для OpenShift) через docker
$currentPath = $((Get-Location).path)
$containerId = Invoke-Expression -Command "docker run --rm -v $($currentPath):/deploy -td ebits/openshift-client"
docker exec $containerId oc apply -f /deploy/openshift.yml
Проблема с приведенным выше фрагментом кода, если есть ошибка в файле yml ошибка не отображается на консоли правильно, так как ни выражение-вызов, ни вызов docker напрямую не отображают стандартную ошибку на консоли. Итак, чтобы зафиксировать ошибку консоли, я придумал функцию
function Get-ProcessOutput
{
Param (
[Parameter(Mandatory=$true)]$Command,
$Args
)
$process = New-Object System.Diagnostics.Process
$process.StartInfo.UseShellExecute = $false
$process.StartInfo.RedirectStandardOutput = $true
$process.StartInfo.RedirectStandardError = $true
$process.StartInfo.FileName = $Command
if($Args) { $process.StartInfo.Arguments = $Args }
$process.Start() | Out-Null
$StandardOutput = $process.StandardOutput.ReadToEnd()
$StandardError = $process.StandardError.ReadLine()
$process.WaitForExit()
if ($process.ExitCode -gt 0) {
Write-Host "*************************************************"
Write-Host $StandardError
Write-Host "*************************************************"
Fail-Step "An error occurred while executing the command $Command $Args"
} else {
return $StandardOutput
}
}
Затем я использую метод Get-ProcesOutput для выполнения команд
$currentPath = $((Get-Location).path)
$containerId = (Get-ProcessOutput -Command "docker" -Args "run --rm -v $($currentPath):/deploy -td ebits/openshift-client").Trim()
Get-ProcessOutput -Command "docker" -Args "exec $containerId oc apply -f /deploy/openshift.yml"
Одна из проблем, с которыми я сталкиваюсь метод в том, что иногда моя docker exe c команда просто зависает без выхода.
Может кто-нибудь помочь мне разобраться, что здесь может пойти не так? Или в PowerShell есть лучший подход для захвата стандартной ошибки?