Почему выходные данные "docker run -t" включают \ r в выходные данные команды? - PullRequest
6 голосов
/ 07 марта 2019

Я использую Docker-клиент. Версия: 18.09.2.

Когда я запускаю контейнер в интерактивном режиме и запускаю команду date, затем направляю его вывод в hexdump для проверки, явидя конечный \n, как и ожидалось:

$ docker run --rm -i -t alpine
/ # date | hexdump -c
0000000   T   h   u       M   a   r           7       0   0   :   1   5
0000010   :   0   6       U   T   C       2   0   1   9  \n
000001d

Однако, когда я передаю команду date в качестве точки входа напрямую и запускаю контейнер, я получаю \r \n каждый раз, когда естьНовая строка в выводе.

$ docker run --rm -i -t --entrypoint=date alpine | hexdump -c
0000000   T   h   u       M   a   r           7       0   0   :   1   6
0000010   :   1   9       U   T   C       2   0   1   9  \r  \n
000001e

Это странно.

Когда я опускаю -t (без выделения TTY), этого совершенно не происходит:

docker run --rm -i --entrypoint=date alpine | hexdump -c
0000000   T   h   u       M   a   r           7       0   0   :   1   7
0000010   :   3   0       U   T   C       2   0   1   9  \n
000001d

Что здесь происходит?

Это звучит опасно, так как я использую команду docker run в своих скриптах, и если я забуду пропустить -t в моих скриптах, вывод я получу от docker run команда будет иметь невидимых / не печатаемых \r символов, которые могут вызвать всевозможные проблемы.

1 Ответ

4 голосов
/ 11 марта 2019

tldr;Это tty поведение по умолчанию, не связанное с докером.Согласно заявке , поданной на github, о вашей проблеме .


Цитирование соответствующих комментариев в этом тикете:

Похоже, что это действительно TTY по умолчанию переводит переводы строк в CRLF

$ docker run -t --rm debian sh -c "echo -n '\n'" | od -c
0000000   \r  \n
0000002

отключение «перевода новой строки в символ возврата каретки-новой строки» с помощью stty -onlcr корректно дает;

$ docker run -t --rm debian sh -c "stty -onlcr && echo -n '\n'" | od -c
0000000   \n
0000001

Параметры TTY по умолчанию, похоже, устанавливаются ядром ... На моемхост linux содержит:

/*
 * Defaults on "first" open.
 */
#define TTYDEF_IFLAG    (BRKINT | ISTRIP | ICRNL | IMAXBEL | IXON | IXANY)
#define TTYDEF_OFLAG    (OPOST | ONLCR | XTABS)
#define TTYDEF_LFLAG    (ECHO | ICANON | ISIG | IEXTEN | ECHOE|ECHOKE|ECHOCTL)
#define TTYDEF_CFLAG    (CREAD | CS7 | PARENB | HUPCL)
#define TTYDEF_SPEED    (B9600)

ONLCR действительно есть.

Когда мы смотрим на документацию флага ONLCR, мы видим, что:

[-] onlcr: перевод новой строки в возврат каретки-новая строка

Чтобы снова процитировать билет github :

Мораль истории, не используйте -t, если вы не хотите TTY.
Концы строк TTY - CRLF, это не докер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...