У меня есть приложение Python (2.7), которое запускается в моем dockerfile:
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 ...
Attach также ничего не отображает:
$ 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
источник
ENV PYTHONUNBUFFERED=0
если-u
флаг не работает.-u
здесь: stackoverflow.com/questions/107705/disable-output-bufferingВ моем случае запуск Python с
-u
ничего не изменил. Что, однако, помогло установитьPYTHONUNBUFFERED=0
переменную окружения:источник
-e PYTHONUNBUFFERED=0
помогает.-u
. Ваше решение исправило это для меня на Docker для Mac с DjangoДля меня это особенность, а не ошибка. Без псевдо-TTY нет ничего, что могло бы вылиться. Итак, простое решение - выделить псевдо-TTY для вашего работающего контейнера с помощью:
источник
tty: true
в составе землиСмотрите эту статью, которая подробно объясняет причину поведения:
А GNU libc (glibc) использует следующие правила для буферизации:
Так что, если использовать
-t
, из докерского документа , он выделит псевдо-tty, затемstdout
станетline-buffered
, таким образом,docker run --name=myapp -it myappimage
может видеть однострочный вывод.И, если просто использовать
-d
, не терминал не был выделен, тоstdout
естьfully-buffered
, одна линия ,App started
конечно , не в состоянии очистить буфер.Затем используйте
-dt
дляmake stdout line buffered
или добавить-u
в питона , чтобыflush the buffer
это способ исправить это.источник
Если вы хотите добавить свои выходные данные для печати к выходным данным Flask во время работы
docker-compose up
, добавьте следующее в ваш файл составления Docker.https://docs.docker.com/compose/environment-variables/
источник
Вы можете увидеть журналы на отдельном изображении, если вы измените
print
наlogging
.main.py:
Dockerfile:
источник
Так как я еще не видел этот ответ:
Вы также можете сбросить стандартный вывод после печати на него:
источник
Попробуйте добавить эти две переменные среды в ваше решение
PYTHONUNBUFFERED=1
иPYTHONIOENCODING=UTF-8
источник
В качестве быстрого решения попробуйте это:
Это работает для меня, когда я сталкиваюсь с такими же проблемами. Но, честно говоря, я не знаю, почему происходит эта ошибка.
источник
Мне пришлось использовать
PYTHONUNBUFFERED=1
в моем файле docker-compose.yml, чтобы увидеть выходные данные из runserver django.источник
Обычно мы перенаправляем его в определенный файл (монтируя том с хоста и записывая его в этот файл).
Добавление tty с использованием -t также хорошо. Вы должны поднять это в журналах докера.
Используя большие выходы журнала, у меня не было никаких проблем с сохранением всего буфера, не помещая это в журнал докеров.
источник
Если вы не используете
docker-compose
и простоdocker
вместо этого, вы можете добавить это к вашемуDockerfile
, где размещается приложение флягиисточник