如何防止 Docker 弄乱子进程输出顺序? 包括 MCVE

问题描述

考虑这个 issue.py 文件:

import subprocess

print('Calling subprocess...')
subprocess.run(['python','--version'])
print('Subprocess is done!')

手动执行 python issue.py 会产生我期望的结果:

Calling subprocess...
Python 3.9.0
Subprocess is done!

但是,如果我在 Docker 容器中执行此操作,则会发生一些奇怪的事情:

$ docker run --rm -v $(pwd):/issue python:3.9.0 python /issue/issue.py
Python 3.9.0
Calling subprocess...
Subprocess is done!

我该如何解决这个问题,让 Docker 遵守正确的输出顺序?

注意事项:

  • 这个问题也发生在 stderr 上,尽管上面的 MCVE 没有显示出来。
  • MCVE 直接使用 python 映像,但在我的实际用例中,我有一个来自使用 FROM python 的自定义 Dockerfile 的自定义映像。
  • capture_output=True 调用中使用 subprocess.run 然后打印捕获的输出对我来说不是一个选项,因为我的实际用例调用了一个子进程,该子进程随着时间的推移将信息打印到 stdout(不像python --version) 并且我不能等待它完成之后才打印整个输出。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)