Die Erfassung der Ausgabe des python-Skript laufen in einem docker-container
Ziel ist es, zu einem docker-container als sichere sandbox ausführen von nicht vertrauenswürdigen python-Skripte, sondern zu tun, so innerhalb von python unter Verwendung des andockfensters-py-Modul, und in der Lage zu erfassen Sie die Ausgabe des Skripts.
Bin ich mit einem python-Skript foo.py innerhalb eines docker-container (es ist festgelegt, wie die ENTRYPOINT
Befehl in meinem Dockerfile, so dass es ausgeführt wird, sobald der container laufen) und bin nicht in der Lage zu erfassen Sie die Ausgabe des Skripts. Wenn ich den container über die normale CLI mit
docker run -v /host_dirpath:/cont_dirpath my_image
(host_dirpath
wird das Verzeichnis mit foo.py) ich bekomme die erwartete Ausgabe von foo.py gedruckt auf stdout, die nur ein Wörterbuch von Schlüssel-Wert-Paare. Dennoch versuche ich, dies zu tun innerhalb von python unter Verwendung des andockfensters-py-Modul, und irgendwie die Ausgabe des Skripts wird nicht gefangen genommen von der logs
Methode. Hier ist der python-code, den ich verwende:
from docker import Client
docker = Client(base_url='unix://var/run/docker.sock',
version='1.10',
timeout=10)
contid = docker.create_container('my_image', volumes={"/cont_dirpath":""})
docker.start(contid, binds={"/host_dirpath": {"bind": "/cont_dirpath"} })
print "Docker logs: " + str(docker.logs(contid))
Die nur Ergebnisse in "Docker logs:" nichts ist gefangen in den logs, weder stdout noch stderr (ich habe versucht, das auslösen einer Ausnahme innerhalb foo.py um dies zu testen).
Den Ergebnissen bin ich nach berechnet werden durch foo.py und derzeit sind Sie nur gedruckt auf stdout mit einem python - print
- Anweisung. Wie kann ich diese in die docker-container-logs so lese ich es in python? Oder erfassen Sie diese Ausgabe einige andere Weg von außerhalb des Containers?
Jegliche Hilfe würde sehr geschätzt werden. Vielen Dank im Voraus!
EDIT:
Immer noch kein Glück mit docker-py, aber es funktioniert gut bei der Ausführung der container mit der normalen CLI mit subprocess.Popen - die Ausgabe ist in der Tat richtig gepackt stdout, wenn dies zu tun.
- Möglich, Duplikat der Python-app nicht alles drucken beim ausführen freistehendes docker
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie dieses Verhalten Auftritt, weil python Puffer seine Ausgänge standardmäßig.
Nehmen Sie dieses Beispiel:
dann die Beobachtung der Protokolle aus einem container läuft als daemon nicht alles zeigen:
aber wenn Sie deaktivieren Sie die python-Gepufferter Ausgang mit der
-u
Befehl Linie parameter, alles zeigt sich:Können Sie auch Spritzen die
PYTHONUNBUFFERED
Umgebungsvariable:Beachten Sie, dass dieses Verhalten betrifft nur Container laufen ohne das
-t
oder--tty
parameter.-u
nichts verändert. NurPYTHONUNBUFFERED=0
für mich gearbeitet.Möglicherweise eine race-Bedingung, da der container gestartet wird, laufen parallel zu Ihrem control-Programm. Sie müssen warten, für Ihre container zu starten und zu beenden, bevor packte den logs. Fügen Sie ein Andockfenster.warten, um Ihren code direkt nach Andockfenster.start.
Ihren Ausgang scheint leer, weil noch nichts angemeldet.