Beim Ausführen eines Containers ohne '-it' wird nur eine Zeile der SimpleHTTPServer-Ausgabe nicht angezeigt.

8

Hinweis: Ich versuche hier in einem realen Projekt kein Problem zu lösen. Diese Frage soll nur den Grund für die Ergebnisse verstehen, die ich im zweiten Experiment (Experiment 2) sehe.

Diese Experimente wurden unter Verwendung der Docker-Version 17.12.0-ce unter Mac OS Terminal Version 2.8 unter macOS High Sierra 10.13.1 durchgeführt.

Experiment 1: docker run SimpleHTTPServer mit -it Optionen

Hier ist mein Dockerfile :

%Vor%

Ich baue es und führe es mit diesem Befehl aus:

%Vor%

In einem anderen Terminal teste ich den Container mit diesem Befehl:

%Vor%

Der Befehl curl erzeugt erwartete Ergebnisse: eine Verzeichnisliste. Im Terminal, auf dem docker run läuft, sehe ich diese erwartete Ausgabe.

%Vor%

Zum Schluss stoppe ich diesen Andock-Container durch Drücken von Strg + C .

Experiment 2: docker run SimpleHTTPServer ohne -it Optionen

Jetzt starte ich das gleiche pyhttp image mit diesem Befehl:

%Vor%

Auf dem Terminal wird keine Ausgabe angezeigt, obwohl der Container ausgeführt wird. Ich sehe nicht die erwartete Nachricht Serving HTTP on 0.0.0.0 port 8000 ... .

Obwohl ich den Container mit curl http://localhost:8000/ testen kann, sehe ich das Protokoll für die GET -Anfrage, die im Terminal erscheint, auf dem docker run läuft.

%Vor%

Frage: Warum erscheint die erste Serving HTTP on 0.0.0.0 port 8000 ... -Nachricht nicht, aber die nachfolgenden Protokolle für HTTP-Anfragen erscheinen?

Experiment 3: docker run Flask App ohne -it Optionen

Ich baue es und führe es mit diesem Befehl aus:

%Vor%

In einem anderen Terminal teste ich den Container mit diesem Befehl:

%Vor%

Im Terminal, auf dem docker run läuft, sehe ich diese erwartete Ausgabe.

%Vor%

Frage: Warum wurde die Serving HTTP on 0.0.0.0 port 8000 ... -Nachricht nur in Experiment 2 nicht angezeigt?

    
Lone Learner 04.02.2018, 10:27
quelle

1 Antwort

6

Die erste Ausgabezeile von python -m SimpleHTTPServer wird in stdout gedruckt; Die restlichen Zeilen werden in stderr gedruckt. Berücksichtigen Sie den Unterschied zwischen diesen Aufrufen:

%Vor%

Die zweite Zeile zeigt nicht die Zeile "Serving", weil stdout verworfen wird, aber beide zeigen die Protokollzeilen an, weil stderr nicht vorhanden ist. Flask hingegen schreibt sein "startendes" Protokoll in stderr (sowie weitere Protokollzeilen):

%Vor%

(von hier aus bearbeitet) Was mit dem Docker-Aufruf von python passiert, ist, dass ohne die -t -Option stdout vollständig gepuffert und mit der -t -Option liniengepuffert ist, so dass sie sofort nach jedem Zeilenumbruch erscheint .

%Vor%

Ich bin immer noch auf der Suche nach einer definitiven Quelle dazu ( dieser Artikel sieht vielversprechend aus), aber es scheint, dass wenn sys.stdout.isatty() is True , python öffnet stdout im Zeilenpuffermodus, so dass jede Zeile so angezeigt wird, wie sie gedruckt wird, aber wenn nicht, wird sie im vollständig gepufferten Modus geöffnet und die Ausgabe wird nur gedruckt, wenn der Puffer voll ist.

    
Nathan Vērzemnieks 07.02.2018, 06:20
quelle

Tags und Links