在Docker容器中打印子过程命令的标准输出

时间:2019-05-18 23:37:08

标签: python docker subprocess popen

我在显示使用docker容器中的Python subprocess.Popen运行的命令的输出时遇到问题。终端仅在进程运行时挂起,直到最后才打印输出。 我有这样的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。

编辑: 因此,问题在于“运行”命令挂起,直到容器进程结束后才返回。 我找到了一种在分离模式下运行容器的方法:

  • 在shebang中添加了-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))

0 个答案:

没有答案