2015-01-21 2 views
5

Я пишу файл Docker, который должен запускать несколько команд как часть инструкции CMD, и я подумал, что правильным способом сделать это будет запуск сценария оболочки с помощью главного демона, выполняемого через exec. К сожалению, как часть этого процесса часть моего вывода (stdout? Stderr? Я не знаю, и я не знаю, как узнать) теряется.При запуске сервера Django dev с docker/fig, почему некоторые из выходных данных журнала скрыты?

Вот сценарий оболочки:

#!/bin/sh 

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

Идея заключается в том, что команда migrate просто запустить один раз и показали его выход, а затем команда runserver должна взять на себя и контейнер не работает до тех пор, что процесс не завершит работу.

Фактическая проблема заключается в том, что вывод migrate отображается правильно, но немедленный вывод runserver не показан. Как ни странно, более поздний запрос журнала runserver показан просто отлично.

Чтобы уточнить, вот выход я ожидал:

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

Вот что я получаю с fig up:

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

Я даже не уверен, кто виноват это. Изменяет ли команда runserver свой выход в зависимости от того, как он запускается? Это проблема с exec? Это докер/рис?

Как одна дополнительная точка данных, я заметил, что я получаю весь вывод при запуске контейнера с fig run web, но не тогда, когда я делаю fig up, но я не понимаю, как это отличается или релевантно.

Примечание: извините за спам тега, я уменьшу теги, как только узнаю, что на самом деле вызывает этот эффект.

+0

Вы можете перенаправить вывод вручную и позже использовать переадресацию «>>» позже. – Paul

+0

@Paul Что значит? Я не использую никаких переадресаций '>>' append. –

+0

Зачем запускать миграцию перед каждым сервером? Вы можете сделать 'django-admin.py' точкой входа и запустить миграцию, например' fig run migrate'. –

ответ

5

Я нашел этот старый вопрос сегодня, используя докер-композитор. Модуль протоколирования Python проверяет, является ли вывод терминалом, поэтому вам нужно добавить tty: true в службу. Пример:

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

У меня нет возможности проверить это прямо сейчас, но это звучит как очень правдоподобное объяснение, поэтому спасибо, что разместили здесь свои результаты! –

+0

Прекрасно работает для меня, спасибо большое. Этот ответ должен быть принят. –

+0

Принято на основании подтверждения Робин. –