首页 > 解决方案 > 如何防止 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 尊重正确的输出顺序?

笔记:

标签: pythondockersubprocessstdoutstderr

解决方案


正如@DavidMaze 在评论中指出的那样,我只需要将PYTHONUNBUFFERED环境变量设置为1. 例如,这可以通过以下方式完成:

docker run --rm -e PYTHONUNBUFFERED=1 -v $(pwd):/issue python:3.9.0 python /issue/issue.py

推荐阅读