2015-01-21 6 views
5

Ich schreibe eine Dockerfile, die mehrere Befehle als Teil der CMD-Anweisung ausführen muss, und ich dachte, der richtige Weg wäre, ein Shell-Skript mit dem Hauptdämon auszuführen, der über exec ausgeführt wird. Leider, als Teil dieses Prozesses geht etwas von meiner Ausgabe (stdout? Stderr? Ich weiß nicht, und ich weiß nicht, wie ich herausfinden soll) verloren.Wenn ein Django-Dev-Server mit docker/fig ausgeführt wird, warum werden einige Log-Ausgaben ausgeblendet?

Hier ist das Shell-Skript:

#!/bin/sh 

python manage.py migrate 
exec python manage.py runserver 0.0.0.0:8000 

Die Idee dahinter ist, dass der migrate Befehl nur einmal ausgeführt wird und dessen Ausgang gezeigt, und dann wird der runserver Befehl sollte über und der Behälter läuft bis zu diesem Prozess beendet nehmen. Das tatsächliche Problem ist, dass die Ausgabe von migrate korrekt angezeigt wird, aber die sofortige Ausgabe von runserver nicht angezeigt wird Seltsamerweise wird die spätere Anforderungsprotokollierung von runserver einwandfrei angezeigt.

zu klären, hier ist der Ausgang ich erwartet habe:

[...] 
No migrations to apply. 
[...] 
Starting development server at http://0.0.0.0:8000/ 
Quit the server with CONTROL-C. 
[21/Jan/2015 16:27:06] "GET/HTTP/1.1" 200 15829 

was hier ich bin immer mit fig up:

[...] 
No migrations to apply. 
[...] 
[21/Jan/2015 16:27:06] "GET/HTTP/1.1" 200 15829 

mir nicht einmal sicher bin, wer schuld ist dies. Ändert der runserver Befehl seine Ausgabe abhängig davon, wie er ausgeführt wird? Ist es ein Problem mit exec? Ist es Docker/Feige?

Als einen zusätzlichen Datenpunkt habe ich festgestellt, dass ich die gesamte Ausgabe beim Ausführen des Containers mit fig run web, aber nicht, wenn ich tun fig up, aber ich verstehe nicht, wie das anders oder relevant ist.

Hinweis: Entschuldigung für den Tag Spam, ich werde die Tags reduzieren, sobald ich weiß, was tatsächlich diesen Effekt verursacht.

+0

Sie könnten Ausgabe manuell umleiten und append Weiterleitungen '>>' später verwenden. – Paul

+0

@Paul Was meinst du? Ich verwende keine '>>' Anhängen Weiterleitungen. –

+0

Warum läuft die Migration vor jedem Runserver? Sie können 'django-admin.py' zu einem Einstiegspunkt machen und eine Migration wie' fig run migrate' ausführen. –

Antwort

5

Ich habe dieses alte Problem heute mit Docker Composer gefunden. Das Python-Protokollierungsmodul prüft, ob die Ausgabe ein Terminal ist. Daher müssen Sie dem Dienst tty: true hinzufügen. Beispiel:

version: '2' 
services: 
    django: 
    tty: true 
    command: python -u manage.py runserver 0.0.0.0:8080 
    ports: 
    - "8080:8080" 
+0

Ich habe nicht die Möglichkeit, dies jetzt zu testen, aber klingt nach einer sehr plausiblen Erklärung, also vielen Dank, dass Sie hier Ihre Ergebnisse veröffentlicht haben! –

+0

Funktioniert perfekt für mich, vielen Dank. Diese Antwort sollte akzeptiert werden. –

+0

Akzeptiert, basierend auf Robins Bestätigung. –

Verwandte Themen