Docker Exec испортил терминальную ленту?

472
Roger Lipscombe

Когда я перенаправляю вывод из docker execдругой команды, это, кажется, портит окончания строки моего терминала.

Например:

$ docker exec -it foo sh -c 'echo {\"a\":\"b\",\"c\":\"d\"}' | jq { "a": "b", "c": "d" } $ 

Но если я тогда сразу же выполню ту же команду на том же терминале на хосте:

$ sh -c 'echo {\"a\":\"b\",\"c\":\"d\"}' | jq { "a": "b", "c": "d" } 

...как и ожидалось.

Если я перенаправлю вывод xxd, он, кажется, вводит символ CR, а также LF (0d0a, а не 0a); это также портит вывод из xxd:

$ docker exec -i -t foo sh -c 'echo {\"a\":\"b\",\"c\":\"d\"}' | xxd 00000000: 7b22 6122 3a22 6222 2c22 6322 3a22 6422 {"a":"b","c":"d" 00000010: 7d0d 0a  

Если я попытаюсь исключить докер, выпуская \r\nсам, это нормально:

$ printf "{\"a\":\"b\",\"c\":\"d\"}\r\n" | xxd 00000000: 7b22 6122 3a22 6222 2c22 6322 3a22 6422 {"a":"b","c":"d" 00000010: 7d0d 0a }.. $ 

... что подразумевает, что это так docker exec.

И мой хост, и контейнер работают под управлением Linux. docker infoотчеты Server Version: 18.03.1-ce. docker -vотчеты Docker version 18.03.1-ce, build 9ee9f40.

Что сделал docker execс моим терминалом (временно) и как мне это исправить?

2
На какой ОС вы запускаете эти команды? Attie 6 лет назад 0
Linux; обновил вопрос. Roger Lipscombe 6 лет назад 0
Спасибо .. и продолжение: какой образ докера вы используете? Можете ли вы воспроизвести с помощью базового `ubuntu: latest` или аналогичного? (Не могу) Attie 6 лет назад 0
Нашел: Это связано с `-t`; если кто-то может написать ответ, объясняющий почему, этого было бы достаточно. Roger Lipscombe 6 лет назад 1

2 ответа на вопрос

2
Attie

Очень интересно...

docker run -d ubuntu:latest sleep infinity 
$ docker exec -i sharp_einstein sh -c 'echo {\"a\":\"b\",\"c\":\"d\"}' | jq { "a": "b", "c": "d" } 
$ docker exec -it sharp_einstein sh -c 'echo {\"a\":\"b\",\"c\":\"d\"}' | jq { "a": "b", "c": "d" } 
$ docker exec -i -t sharp_einstein sh -c 'echo {\"a\":\"b\",\"c\":\"d\"}' | jq { "a": "b", "c": "d" } 

Разделяя -iи -tпозволяя появиться проблеме ... (возможно, ошибка?)


Глядя на справочную страницу для docker exec:

 -t, --tty=true|false Allocate a pseudo-TTY. The default is false. 

Псевдо-TTY (PTY) позволяют системе взаимодействовать с вами (человеком) ... В результате докер выделяет новый PTY на время exec(внутри контейнера) и такие вещи, как создание новой строки, высота и ширина терминала входят в игру - наряду с грузом других вещей.

Я не могу полностью объяснить это, но это не то, что вы хотите от чего-то, что подается в трубопровод.


Сравните также:

$ docker exec -i sharp_einstein sh -c 'stty' stty: 'standard input': Inappropriate ioctl for device 
$ docker exec -i -t sharp_einstein sh -c 'stty' speed 38400 baud; line = 0; -brkint -imaxbel 
$ stty speed 38400 baud; line = 0; -brkint -imaxbel 

sttyспособен контролировать обработку PTY возвратов каретки и новых строк, хотя эти параметры для меня здесь не имели никакого эффекта. Со страницы руководства:

 * [-]ocrnl translate carriage return to newline  * [-]onlcr translate newline to carriage return-newline 

Существуют аналогичные наблюдения sst -t, например, со ступеньками при использовании pty (через ssh) и более

Интересно. В моей установке нет разницы между `-i -t` и` -it`; они оба сломаны. Roger Lipscombe 6 лет назад 1
Кроме того: почему поведение псевдо-tty влияет на поведение tty моего терминала? `jq` работает в моем tty. Roger Lipscombe 6 лет назад 0
К сожалению, это относится к моему «_Я не могу полностью объяснить это _» ... Я в лучшем случае могу предложить гипотезу, что `docker` играет с вашим локальным PTY, чтобы сделать вещи более" _transparent _ "... Я мог бы покопаться в некоторых источниках потом... Attie 6 лет назад 0
0
frbayart

Вы пробовали с "-n" на "echo -n " как:

$ docker exec -it upbeat_mendeleev sh -c 'echo {\"a\":\"b\",\"c\":\"d\"}' | jq . { "a": "b", "c": "d" }   $ docker exec -it upbeat_mendeleev sh -c 'echo -n {\"a\":\"b\",\"c\":\"d\"}' | jq . { "a": "b", "c": "d" } 
Я на самом деле не использую `echo`; это всего лишь пример для воспроизведения. Поэтому я не могу добавить `-n`. Roger Lipscombe 6 лет назад 0