Приложение Python ничего не печатает при запуске отсоединенного в докере

У меня есть приложение Python (2.7), которое запускается в моем файле docker:

CMD ["python","main.py"] 

main.py печатает некоторые строки при запуске и затем переходит в цикл:

 print "App started" while True: time.sleep(1) 

Пока я запускаю контейнер с флагом -it, все работает так, как ожидалось:

 $ docker run --name=myapp -it myappimage > App started 

И я могу увидеть тот же вывод через журналы:

 $ docker logs myapp > App started 

Если я попытаюсь запустить тот же контейнер с флагом -d, контейнер, похоже, начнет нормально, но я не вижу никакого вывода:

 $ docker run --name=myapp -d myappimage > b82db1120fee5f92c80000f30f6bdc84e068bafa32738ab7adb47e641b19b4d1 $ docker logs myapp $ (empty) 

Но контейнер все еще, кажется, работает;

 $ docker ps Container Status ... myapp up 4 minutes ... 

В приложении ничего не отображается:

 $ docker attach --sig-proxy=false myapp (working, no output) 

Любые идеи, что происходит не так? Выполняется ли «печать» по-разному при работе в фоновом режиме?

Версия докера:

 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 

  • Почему один и тот же запрос SQLite в 30 раз медленнее при получении всего в два раза больше результатов?
  • Прикрепите вычисленный столбец к существующему файловому кадру
  • Сохранение массива numpy в csv вызывает несоответствие типаError
  • Как я могу ждать внутри __await__ будущего?
  • Фильтрация строк данных данных, если значение в столбце указано в списке значений
  • Как заменить экземпляр в __init __ () на другой объект?
  • отбрасывать завершающие нули из десятичных
  • Могу ли я получить исключение из блока finally в python?
  • 4 Solutions collect form web for “Приложение Python ничего не печатает при запуске отсоединенного в докере”

    Наконец, я нашел решение увидеть вывод Python при запуске демонтированного в Docker, благодаря @ahmetalpbalkan в GitHub . Отвечая на него здесь для дальнейших ссылок:

    Использование небуферизованного вывода с

     CMD ["python","-u","main.py"] 

    вместо

     CMD ["python","main.py"] 

    решает проблему; вы можете увидеть результат (оба, stderr и stdout) через

     docker logs myapp 

    Теперь!

    В моем случае запуск Python с -u ничего не менял. Однако целью было установить PYTHONUNBUFFERED=0 качестве переменной окружения:

     docker run --name=myapp -e PYTHONUNBUFFERED=0 -d myappimage 

    Для меня это особенность, а не ошибка. Без псевдо-TTY нет ничего общего с stdout. Поэтому простым решением является выделение псевдотематического TTY для запускаемого контейнера:

     $ docker run -t ... 

    В качестве быстрого исправления попробуйте следующее:

     from __future__ import print_function # some code print("App started", file=sys.stderr) 

    Это работает для меня, когда я сталкиваюсь с теми же проблемами. Но, честно говоря, я не знаю, почему эта ошибка происходит.

    Python - лучший язык программирования в мире.