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.
docker run
SimpleHTTPServer mit -it
Optionen Hier ist mein Dockerfile
:
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.
Zum Schluss stoppe ich diesen Andock-Container durch Drücken von Strg + C .
docker run
SimpleHTTPServer ohne -it
Optionen Jetzt starte ich das gleiche pyhttp
image mit diesem Befehl:
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.
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?
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.
Frage: Warum wurde die Serving HTTP on 0.0.0.0 port 8000 ...
-Nachricht nur in Experiment 2 nicht angezeigt?
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:
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):
(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 .
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.
Tags und Links python docker httpserver