Я пытаюсь собрать докер с простым сценарием 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"