Docker-Exec verwirrt Terminalzeilen-Feeds?

551
Roger Lipscombe

Wenn ich die Ausgabe an docker execeinen anderen Befehl weiterleite, scheint es, dass die Zeilenenden meines Terminals durcheinander geraten.

Zum Beispiel:

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

Wenn ich dann gleich den gleichen Befehl im selben Terminal auf dem Host durchführe:

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

...wie erwartet.

Wenn ich die Ausgabe xxddurchlade, scheint ein CR-Zeichen sowie der LF (0d0a statt 0a) einzuführen. Die Ausgabe wird außerdem durcheinander gebracht 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  

Wenn ich versuche, Docker auszuschließen, indem \r\nich mich selbst aussende, ist das in Ordnung:

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

... was bedeutet, dass es ist docker exec.

Sowohl mein Host als auch der Container laufen unter Linux. docker infoBerichte Server Version: 18.03.1-ce. docker -vBerichte Docker version 18.03.1-ce, build 9ee9f40.

Was hat docker execmein Terminal (vorübergehend) gemacht und wie kann ich es beheben?

2
Auf welchem ​​Betriebssystem führen Sie diese Befehle aus? Attie vor 5 Jahren 0
Linux; hat die Frage aktualisiert. Roger Lipscombe vor 5 Jahren 0
Danke .. und ein Follow-up: Was ist das Docker-Image, das Sie ausführen? Kannst du es mit einem einfachen `ubuntu: latest 'oder ähnlichem reproduzieren? (Ich kann nicht) Attie vor 5 Jahren 0
Fand es: es liegt am `-t`; Wenn jemand eine Antwort schreiben kann, die erklärt, warum, wäre das ausreichend. Roger Lipscombe vor 5 Jahren 1

2 Antworten auf die Frage

2
Attie

Sehr interessant...

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" } 

Trennen Sie das -iund -tlassen Sie die Ausgabe erscheinen ... (möglicherweise ein Fehler?)


Auf der Manpage nach docker exec:

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

Pseudo-TTYs (PTYs) ermöglichen dem System die Interaktion mit Ihnen (einem Menschen) ... Das Ergebnis ist, dass Andock einen neuen PTY für die Dauer des execContainers (innerhalb des Containers) zuordnet, und zum Beispiel, wie eine Zeilenschaltung erstellt wird Höhe und Breite der Klemmen kommen ins Spiel - neben vielen anderen Dingen.

Ich kann es nicht ganz erklären, aber es ist nicht das, was Sie von etwas erwarten, das in eine Pipeline einfließt.


Vergleichen Sie auch:

$ 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 

sttyist in der Lage, die Handhabung von Wagenrückläufen und Zeilenumbrüchen durch den PTY zu steuern, obwohl diese Optionen hier für mich keine Auswirkung hatten. Aus der Manpage:

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

Ähnliche Beobachtungen gibt es sst -tzum Beispiel: Treppenstufen bei Verwendung eines pty (durch ssh) und Paspeln zu mehr

Interessant. Es gibt keinen Unterschied zwischen "-i -t" und "-it" in meiner Installation. Sie sind beide kaputt. Roger Lipscombe vor 5 Jahren 1
Außerdem: Warum beeinflusst das Verhalten des Pseudo-Typs das Verhalten des Terminals meines Terminals? `jq` läuft in meinem tty. Roger Lipscombe vor 5 Jahren 0
Leider fällt das in mein "_Ich kann es nicht vollständig erklären _" ... Ich kann im besten Fall eine Hypothese anbieten, dass "Docker" mit Ihrem lokalen PTY spielt, um die Dinge "_transparent _" zu machen ... Ich könnte in einige Quellen eintauchen später... Attie vor 5 Jahren 0
0
frbayart

Haben Sie mit "-n" auf "echo -n " so versucht :

$ 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" } 
Ich verwende eigentlich nicht "Echo"; Dies ist nur ein Beispiel für die Repro. Also kann ich nicht -n hinzufügen. Roger Lipscombe vor 5 Jahren 0