docker-compose无法在Python应用中打印标准输出

时间:2018-07-16 12:47:40

标签: python docker docker-compose

在由Docker Compose管理的Docker容器中运行的Python应用程序中使用print()语句时,仅记录sys.stderr的输出。没有显示香草print()语句,因此:

print("Hello? Anyone there?")

...从不显示在常规日志中:

enter image description here

(您可以在我的应用中看到其他库显式打印的其他日志,但没有我自己的调用。)

如何避免我的print()通话被忽略?

3 个答案:

答案 0 :(得分:10)

默认情况下,Python将输出缓冲到sys.stdout

有几种选择:

1。呼叫明确的flush

重构原始打印语句,使其包含flush=True关键字,例如:

print("Hello? Anyone there?", flush=True)

注意:这将导致刷新整个缓冲区,而不仅仅是同一打印调用。因此,如果在其他地方(即没有flush=True的“裸”打印函数调用没有显式地未缓冲),这些调用也将始终被刷新。

您可以使用以下方法实现相同的目的:

import sys
sys.stdout.flush()

如果您希望最大程度地控制刷新的时间,此选项很有用。

2。通过PYTHONUNBUFFERED env var

取消缓冲整个应用程序

将以下内容拖放到environment文件的docker-compose.yml部分中:

PYTHONUNBUFFERED: 1

这将导致stdout的所有输出立即被刷新。

3。使用-u

运行python

就像上面的选项#2一样,这将导致Python在应用的整个执行生命周期中以“无缓冲”方式运行。只需运行python -u <entrypoint.py>-不需要环境变量。

答案 1 :(得分:5)

如果在Dockerfile的运行行中添加选项-u,它将打印您的日志:

CMD ['python', '-u', 'my_python_script.py']

答案 2 :(得分:0)

使用 pytest,我的解决方案是添加 -s 选项。

例如,在我还需要启用详细模式的场景中,我不得不输入 pytest -sv