используя docker программно и захватывая стандартный выход - PullRequest
0 голосов
/ 21 февраля 2020

Я бы хотел программно запустить несколько 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();
        }
    }

1 Ответ

0 голосов
/ 21 февраля 2020

Да, это хорошая идея - захватить оба, а также использовать двойные кавычки вместо одинарных кавычек для параметра, передаваемого в --format.

    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();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...