C# 以编程方式使用docker并捕获standardoutput
我希望在进程内以编程方式运行一些docker命令,并捕获docker的标准输出。这些命令确实可以正常运行,但我无法捕获标准输出。例如,考虑下面的代码。我想读取docker info命令,但得到的只是一个空字符串。你知道有没有一种方法可以通过这种方式与docker互动吗?谢谢C# 以编程方式使用docker并捕获standardoutput,c#,docker,C#,Docker,我希望在进程内以编程方式运行一些docker命令,并捕获docker的标准输出。这些命令确实可以正常运行,但我无法捕获标准输出。例如,考虑下面的代码。我想读取docker info命令,但得到的只是一个空字符串。你知道有没有一种方法可以通过这种方式与docker互动吗?谢谢 private static void VerifyDocker() { var processStartInfo = new ProcessStartInfo(); var
private static void VerifyDocker()
{
var processStartInfo = new ProcessStartInfo();
var messagesBuilder = new StringBuilder();
var arguments = "info --format '{{json .}}'";
using (var process = new Process())
{
processStartInfo.FileName = "docker";
processStartInfo.Arguments = arguments;
processStartInfo.CreateNoWindow = true;
processStartInfo.UseShellExecute = false;
processStartInfo.RedirectStandardOutput = true;
process.OutputDataReceived += (sender, e) => messagesBuilder.Append(e.Data);
process.StartInfo = processStartInfo;
process.Start();
process.BeginOutputReadLine();
process.WaitForExit();
process.CancelOutputRead();
var message = messagesBuilder.ToString();
}
}
是的,最好同时捕获这两个参数,并对传递到--format的参数使用双引号而不是单引号
docker是写给stdout还是stderr?您还应该捕获stderr(
processStartInfoRedirectStandardError
和process.ErrorDataReceived
)这会保留输出着色的控制字符吗?
private static void VerifyDocker()
{
var processStartInfo = new ProcessStartInfo();
var messagesBuilder = new StringBuilder();
var errorMessagesBuilder = new StringBuilder();
var arguments = "info --format \"{{json .}}\"";
using (var process = new Process())
{
processStartInfo.FileName = "docker";
processStartInfo.Arguments = arguments;
processStartInfo.CreateNoWindow = true;
processStartInfo.UseShellExecute = false;
processStartInfo.RedirectStandardOutput = true;
processStartInfo.RedirectStandardError = true;
process.OutputDataReceived += (sender, e) => messagesBuilder.Append(e.Data);
process.ErrorDataReceived += (sender, e) => errorMessagesBuilder.Append(e.Data);
process.StartInfo = processStartInfo;
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();
process.CancelOutputRead();
process.CancelErrorRead();
var message = messagesBuilder.ToString();
var errrors = errorMessagesBuilder.ToString();
}
}