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

У меня есть простой скрипт, который печатает привет каждые 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

1 ответ

Решение

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

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

      print("Hello", flush=True)

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

      FROM python:3.9
COPY entry.py entry.py
ENTRYPOINT ["python", "-u"]
CMD entry.py
Другие вопросы по тегам