вывод на печать команды подпроцесса в контейнере докера - PullRequest
0 голосов
/ 19 мая 2019

У меня проблемы с отображением вывода команды, запущенной с подпроцессом Python. Открыто в контейнере Docker. Терминал просто зависает во время работы процесса и только в конце выводит вывод. У меня есть скрипт Python, как это (упрощенно):

def test():
  print('start')
  process = subprocess.Popen('pytest', stdout=subprocess.PIPE, universal_newlines=True)
  for line in iter(process.stdout.readline, ''):
    print(">>> {}".format(line.rstrip()))

def docker():
  client = docker.from_env()
  command = './this_script --test'
  generator = client.containers.run('python:3', command, remove=True, init=True, working_dir='/test', stdout=True, stderr=True, stream=True)
  for log in generator:
    print('>>> {}'.format(log))


if __name__ == '__main__':
  parser = argparse.ArgumentParser()
  ...
  # if called with --test, the script calls test()
  # if called with --docker, the script calls docker()

Даже print('start') в начале test() не печатается до конца процесса.

Как сделать так, чтобы стандартный вывод подпроцесса отображался в реальном времени?

Я нахожусь на Ubuntu 18.04, использую Python 3.6.7, Docker версии 18.09.6, сборка 481bc77.

EDIT : Таким образом, проблема в том, что команда «run» зависает и не возвращается, пока не завершится процесс контейнера. Я нашел способ заставить его работать, запустив контейнер в отдельном режиме:

  • Добавлен флаг -u в шебанге
  • Обновлена ​​функция docker() для запуска контейнера в отдельном режиме:
def docker():
  client = docker.from_env()
  command = 'python -u this_script.py --test'
  generator = client.containers.run('python:3', command, remove=True, init=True, working_dir='/test', detach=True)
  for log in generator.logs(stdout=True, stderr=True, stream=True):
    print('>>> {}'.format(log))
...