Почему я не вижу журналы докеров?

У меня есть простой скрипт, который печатает привет каждые 2 секунды.

# entry.py

import time

while True:
    print("hello")
    time.sleep(2)

И у меня есть очень простой файл докера, который запускает этот скрипт.


FROM python:3.9

COPY entry.py entry.py

CMD python entry.py

Сначала я создаю образ докера:

$ docker build -t dtest .

Теперь я запустил его с опцией -it, и все заработало, как и ожидалось.

$ docker run -it dtest
# hello printed to screen every two seconds

Но когда запускаю в отсоединенном режиме, а потом пытаюсь посмотреть логи, то ничего не вижу.

$ docker run -d dtest
e19f7285c098af582e163354be84774d1307b2409337cb03bdd217292899bdb7

$ docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS     NAMES
e19f7285c098   dtest       "/bin/sh -c 'python …"   20 seconds ago   Up 18 seconds             epic_chatterjee

$ docker logs epic_chatterjee
# nothing is shown, exits

$ docker logs -f epic_chatterjee
# a cursor keeps blinking but nothing shown

person aahnik    schedule 07.05.2021    source источник
comment
Спасибо за предоставление такого превосходного примера кода. Это сделало проблему невероятно простой для воспроизведения и отладки.   -  person Adam Smith    schedule 07.05.2021


Ответы (1)


Это связано с тем, как Python буферизует вывод. Поскольку запись в стандартный вывод требует больших вычислительных ресурсов, он пытается собрать большие буферы и сбрасывает их только изредка, если терминал не подключен.

Вы можете изменить свой код Python на:

print("Hello", flush=True)

Или запустите python с флагом -u, который вызывает небуферизованный вывод.

FROM python:3.9
COPY entry.py entry.py
ENTRYPOINT ["python", "-u"]
CMD ["entry.py"]
person Adam Smith    schedule 07.05.2021