Ich habe eine Python (2.7) -App, die in meiner Docker-Datei gestartet wird:
CMD ["python","main.py"]
main.py druckt beim Start einige Zeichenfolgen und geht anschließend in eine Schleife:
print "App started"
while True:
time.sleep(1)
Solange ich den Container mit dem Flag -it starte, funktioniert alles wie erwartet:
$ docker run --name=myapp -it myappimage
> App started
Und ich kann die gleiche Ausgabe später über Protokolle sehen:
$ docker logs myapp
> App started
Wenn ich versuche, denselben Container mit dem Flag -d auszuführen, scheint der Container normal zu starten, aber ich kann keine Ausgabe sehen:
$ docker run --name=myapp -d myappimage
> b82db1120fee5f92c80000f30f6bdc84e068bafa32738ab7adb47e641b19b4d1
$ docker logs myapp
$ (empty)
Aber der Container scheint immer noch zu laufen;
$ docker ps
Container Status ...
myapp up 4 minutes ...
Anhängen zeigt auch nichts an:
$ docker attach --sig-proxy=false myapp
(working, no output)
Irgendwelche Ideen, was falsch läuft? Verhält sich "Drucken" anders, wenn es im Hintergrund ausgeführt wird?
Docker-Version:
Client version: 1.5.0
Client API version: 1.17
Go version (client): go1.4.2
Git commit (client): a8a31ef
OS/Arch (client): linux/arm
Server version: 1.5.0
Server API version: 1.17
Go version (server): go1.4.2
Git commit (server): a8a31ef
quelle
ENV PYTHONUNBUFFERED=0
falls das-u
Flag nicht funktioniert.-u
hier: stackoverflow.com/questions/107705/disable-output-bufferingIn meinem Fall hat das Ausführen von Python mit
-u
nichts geändert. Der Trick bestand jedoch darin, einePYTHONUNBUFFERED=0
Umgebungsvariable festzulegen:quelle
-e PYTHONUNBUFFERED=0
hilft das Hinzufügen .-u
. Ihre Lösung hat es für mich auf Docker für Mac mit DjangoFür mich ist es eine Funktion, kein Fehler. Ohne ein Pseudo-TTY gibt es nichts zu tun. Eine einfache Lösung besteht darin, Ihrem laufenden Container ein Pseudo-TTY zuzuweisen mit:
quelle
tty: true
in komponieren LandIn diesem Artikel wird der detaillierte Grund für das Verhalten erläutert:
Und GNU libc (glibc) verwendet die folgenden Regeln zum Puffern:
Also, wenn die Verwendung
-t
von Docker Dokument , wird es eine pseudo-tty zuweisen, dannstdout
wirdline-buffered
, so dassdocker run --name=myapp -it myappimage
die Ausgabe einzeiligen sehen konnte.Und wenn nur verwendet
-d
, wurde kein tty zugewiesen, dannstdout
istfully-buffered
eine ZeileApp started
sicher nicht in der Lage, den Puffer zu leeren.Dann verwenden Sie
-dt
zumake stdout line buffered
oder fügen Sie-u
Python hinzu,flush the buffer
um das Problem zu beheben.quelle
Wenn Sie Ihre Druckausgabe während der Ausführung zu Ihrer Flask-Ausgabe hinzufügen möchten, fügen Sie
docker-compose up
Ihrer Docker-Erstellungsdatei Folgendes hinzu.https://docs.docker.com/compose/environment-variables/
quelle
Sie können die Protokolle auf freistehende Bild sehen , wenn Sie ändern
print
zulogging
.main.py:
Dockerfile:
quelle
Da ich diese Antwort noch nicht gesehen habe:
Sie können stdout auch nach dem Drucken leeren:
quelle
Versuchen Sie, diese beiden Umgebungsvariablen zu Ihrer Lösung
PYTHONUNBUFFERED=1
und hinzuzufügenPYTHONIOENCODING=UTF-8
quelle
Versuchen Sie als schnelle Lösung Folgendes:
Dies funktioniert bei mir, wenn ich auf dieselben Probleme stoße. Aber um ehrlich zu sein, ich weiß nicht, warum dieser Fehler auftritt.
quelle
Ich musste
PYTHONUNBUFFERED=1
in meiner Datei docker-compose.yml verwenden, um die Ausgabe von django runserver zu sehen.quelle
Normalerweise leiten wir es in eine bestimmte Datei um (indem wir ein Volume vom Host bereitstellen und in diese Datei schreiben).
Das Hinzufügen eines tty mit -t ist ebenfalls in Ordnung. Sie müssen es in Docker-Protokollen abholen.
Bei Verwendung großer Protokollausgaben hatte ich keine Probleme mit der Speicherung aller Puffer, ohne sie in das Docker-Protokoll aufzunehmen.
quelle
Wenn Sie nicht verwenden
docker-compose
unddocker
stattdessen nur normal sind , können Sie dies zu Ihrer hinzufügenDockerfile
, die eine Flaschen-App hostetquelle