хвостовой стек в докере со скриптом Python - PullRequest
2 голосов
/ 16 марта 2019

Я пытаюсь собрать докер с простым сценарием Python для чтения из файла и распечатать его.
Я хочу, чтобы сценарий Python продолжал читать из файла, так как в файле могут быть доступны новые данные.
Но когда файл не существует при запуске сценариев, кажется, что tail не работает и не читает файл.
Вот простой пример:

dockerfile (раскомментируйте, чтобы проиллюстрировать проблему)

FROM ubuntu:18.10
RUN apt-get update     && apt-get install -y --no-install-recommends python3    && rm -rf /var/lib/apt/lists/*
#RUN touch /tmp/file # uncomment will cause the problem
COPY . /app/
CMD ["python3","/app/main.py"]

main.py

import subprocess
argsList = ['tail', '-c-1', '-F', '/tmp/file']
f = subprocess.Popen(argsList, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
line = f.stdout.readline()
while line != b'':
    line = f.stdout.readline().decode("utf-8")
    print(line)

Если я вхожу в докер (, когда естьнет / tmp / file) и начать запись в этот файл (используя echo «текст» >> / tmp / file). Я могу увидеть вывод на экране докера.
Но еслиЯ раскомментирую сенсорный комментарий в файле Docker (который вызывает создание / tmp / файла). Я не могу увидеть какие-либо выходные данные на экране докера, хотя я использую ту же команду (echo)text ">> /tmp/file).
Почему существует такой дифференциал и как я могу увидеть вывод, даже если файлe существует?

- edit -
Я попытался добавить exit (1) после первой строки чтения, чтобы устранить проблему с буфером.
Результат был почти таким же:
Когда строка была коммандной, выход контейнера соответствовал ожидаемому (с кодом выхода 1)
, но когда строка была некомпонентной, контейнер вообще не выходил (вероятно, застрял при чтении изтрубы).
main.py

import subprocess
argsList = ['tail', '-c-1', '-F', '/tmp/file']
f = subprocess.Popen(argsList, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
line = f.stdout.readline()
exit(1)

- правка 2 -
Проблема также возникаетесли есть только файл Docker:
dockerfile

FROM ubuntu:18.10
#RUN touch /tmp/file
CMD "tail" "-c-1" "-F" "/tmp/file"

Ответы [ 2 ]

0 голосов
/ 16 марта 2019

Попробуйте выполнить sys.stdout.flush () после печати, чтобы принудительно выводить буфер вывода на экран. Кажется, у меня работает (тот же dockerfile и скрипт)

0 голосов
/ 16 марта 2019

Это известное поведение, эта проблема связана с файлом нулевого размера, и если вы попытаетесь использовать простой tail -f в контейнере, вы увидите такое же поведение. В той же теме объясняется почему.

Эта опция, при которой нулевой файл существует, является искусственной, в реальной жизни реальные потоки создают файлы с контентом, поэтому этот вопрос не так популярен в Интернете.

Как уже упоминалось в теме, вам необходимо убедиться, что файл существует и его размер не равен нулю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...