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