Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以编程方式使用docker并捕获standardoutput_C#_Docker - Fatal编程技术网

C# 以编程方式使用docker并捕获standardoutput

C# 以编程方式使用docker并捕获standardoutput,c#,docker,C#,Docker,我希望在进程内以编程方式运行一些docker命令,并捕获docker的标准输出。这些命令确实可以正常运行,但我无法捕获标准输出。例如,考虑下面的代码。我想读取docker info命令,但得到的只是一个空字符串。你知道有没有一种方法可以通过这种方式与docker互动吗?谢谢 private static void VerifyDocker() { var processStartInfo = new ProcessStartInfo(); var

我希望在进程内以编程方式运行一些docker命令,并捕获docker的标准输出。这些命令确实可以正常运行,但我无法捕获标准输出。例如,考虑下面的代码。我想读取docker info命令,但得到的只是一个空字符串。你知道有没有一种方法可以通过这种方式与docker互动吗?谢谢

    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();
        }
    }