Почему docker выводит псевдо-tty mangle при передаче по каналу другой команде? - PullRequest
0 голосов
/ 15 февраля 2019

Почему опция псевдо-tty в Docker изменяет вывод, когда вывод Docker передается другим командам?

Docker использует CRLF окончания строк при запуске с параметром -t.Итак, вот мои 2 команды с добавлением CR к другой, чтобы сделать их выходы идентичными.

❯ docker run --rm -ti bash bash -c "echo -n $'\n\n\n'" | od -c
0000000  \r  \n  \r  \n  \r  \n

❯ docker run --rm bash bash -c "echo -n $'\r\n\r\n\r\n'" | od -c
0000000  \r  \n  \r  \n  \r  \n

Обе команды переданы при чтении -loop (я ожидаю, что оба выхода будут идентичны)

❯ while read -r out; do echo A; done < <(docker run --rm -ti bash bash -c "echo -n $'\n\n\n'")
A
 A
  A

❯ while read -r out; do echo A; done < <(docker run --rm bash bash -c "echo -n $'\r\n\r\n\r\n'")
A
A
A

Почему это происходит?Почему псевдо-tty прерывает вывод?Разве он не должен сообщать докеру только о том, что ввод является терминальным устройством?

Конечно, использование -it для неинтерактивных сценариев является допустимым решением для этого, но не отвечает «почему».

1 Ответ

0 голосов
/ 20 февраля 2019

Кажется, что докер-клиент устанавливает stdin и stdout в необработанном режиме, когда включена опция --tty.Существует вызов setRawTerminal(streams) в функции setupInput(), определенной в cli/command/container/hijack.go, которая устанавливает и стандартный ввод, и стандартный вывод в необработанном режиме ( ссылка на github ).

НасколькоЯ знаю, что этот необработанный режим затем распространяется обратно на терминал, который вы используете.Вы можете заметить это, удалив stty -raw из следующего примера и выполнив их по порядку.

Короче говоря, режим raw означает, что терминал не должен выполнять какую-либо обработку строки, то есть терминал не действует на CR (\r).

Простая демонстрация без док-клиента:

❯ while read -r out; do echo A; done < <(bash -c "stty raw; echo -n $'\n\n\n'")   
A
 A
  A

❯ while read -r out; do echo A; done < <(bash -c "stty -raw; echo -n $'\n\n\n'")
A
A
A

или просто:

❯ stty raw; for i in {0..2}; do echo A; done
A
 A
  A

❯ stty -raw; for i in {0..2}; do echo A; done
A
A
A
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...