2015-01-21 11 views
5

Piszę plik Docker, który musi uruchomić wiele poleceń jako część instrukcji CMD i myślałem, że właściwym sposobem jest uruchomienie skryptu powłoki z głównym demonem wykonanym przez exec. Niestety, w ramach tego procesu niektóre moje wyniki (stdout? Stderr? Nie wiem i nie wiem, jak się dowiedzieć) zostają utracone.Podczas uruchamiania serwera Django z funkcją dokowania/rysowania, dlaczego niektóre dane wyjściowe protokołu są ukryte?

Oto skrypt powłoki:

#!/bin/sh 

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

Pomysł jest, że komenda migrate jest po prostu uruchomić raz pokazano jego wyjście, a następnie komenda runserver powinien przejąć i pojemnik biegnie aż wydostająca procesowych.

Problem polega na tym, że wyjście migrate jest wyświetlane poprawnie, ale natychmiastowe wyjście runserver nie jest wyświetlane. O dziwo, później żądanie rejestrowania runserver jest pokazane dobrze.

Aby wyjaśnić, oto wyjście Spodziewałem:

[...] 
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 

Oto co mi chodzi z fig up:

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

Nie jestem nawet pewien, kto jest wina tego jest. Czy polecenie runserver zmienia swój wynik w zależności od sposobu jego uruchomienia? Czy to jest problem z exec? Czy to doker/fig?

Jako dodatkowy punkt danych, zauważyłem, że otrzymuję wszystkie dane wyjściowe podczas uruchamiania kontenera z fig run web, ale nie wtedy, gdy robię fig up, ale nie rozumiem, jak to jest inne lub istotne.

Uwaga: przykro mi z powodu spamu ze znacznikami, zmniejszę liczbę tagów, gdy tylko dowiem się, co właściwie powoduje ten efekt.

+0

Możesz ręcznie przekierować dane wyjściowe, i użyj późniejszych przekierowań ">>". – Paul

+0

@Paul Co masz na myśli? Nie używam żadnych przekierowań ">>". –

+0

Dlaczego przeprowadzanie migracji przed każdym uruchomionym serwerem? Możesz stworzyć 'django-admin.py' punkt początkowy i uruchomić migrację, jak" rysuj run migrate ". –

Odpowiedz

5

Znalazłem ten stary numer dzisiaj, używając kompozytu docker. Moduł rejestrowania w Pythonie sprawdza, czy dane wyjściowe są terminalami, więc musisz dodać usługę tty: true. Przykład:

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

Nie mam teraz możliwości przetestowania tego, ale brzmi to jak bardzo wiarygodne wyjaśnienie, więc dziękuję za opublikowanie swoich wyników tutaj! –

+0

Działa doskonale dla mnie, bardzo dziękuję. Ta odpowiedź powinna zostać przyjęta. –

+0

Przyjęto, na podstawie potwierdzenia Robin. –

Powiązane problemy