python - 如何防止 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
直接使用图像,但在我的实际用例中,我有一个来自自定义 Dockerfile 的自定义图像,它使用FROM python
. capture_output=True
在调用中使用subprocess.run
然后打印捕获的输出对我来说不是一个选项,因为我的真实用例调用了一个子流程,该子流程随着时间的推移打印信息stdout
(不像python --version
),我不能等待它完成之后才打印整个输出。
解决方案
正如@DavidMaze 在评论中指出的那样,我只需要将PYTHONUNBUFFERED
环境变量设置为1
. 例如,这可以通过以下方式完成:
docker run --rm -e PYTHONUNBUFFERED=1 -v $(pwd):/issue python:3.9.0 python /issue/issue.py
推荐阅读
- php - 将 1 添加到字段名称,并在末尾加上周长高级自定义字段 WordPress
- json - 任务内的ansible任务
- python - 使用 Mixin 在类中存储配置(具有继承)
- amazon-web-services - Ubuntu ssh:无法解析主机名 myserver:名称或服务未知
- asp.net-core-2.0 - ASP Core 类型转换器
- influxdb - 来自 influxdb 的不同值
- python - 形状统计
- c# - 从另一个 C# 调用微服务
- install4j - 我如何处理 install4j 中的单击后退按钮?
- kubernetes - Kubernetes Helm Chart 中的命名空间部署问题