Docker 容器仅在退出时打印输出

Tom*_*thi 4 python python-3.x docker

我写了一个 python 程序及其 Dockerfile:

import time
print("Begin")
time.sleep(100);
print("End")
Run Code Online (Sandbox Code Playgroud)

创建了它的图像,并使用它运行docker run <image-id>,令我惊讶的行为是,在控制台中发出运行命令后,它等待 sleep(100) 秒并一起打印"Begin""End"

为什么我们在运行时得不到中间结果?

另外,如果它不会在生成后立即发送数据,我该如何以这种方式编写流应用程序(在卡夫卡等中)?

sin*_*ere 6

当您从控制台运行 python 脚本时,它会立即在stdout上显示Begin ,因为它是一个 tty(交互式)并在每行末尾刷新。但是,如果您像这样重定向stdoutstdin,python 脚本将不会注意到它是从 tty 运行的,并且只会在完成时刷新。python /tmp/a.py < /dev/null | cat

如果您从 docker 容器运行相同的脚本,默认情况下它没有 tty,您必须明确要求一个--tty , -t Allocate a pseudo-TTY

docker run -t yourimage
Run Code Online (Sandbox Code Playgroud)

或者,如果您不希望容器使用 tty 运行,则可以通过设置PYTHONUNBUFFERED环境变量、向 python 解释器添加-u选项或修改脚本来强制刷新发生,如下所示:

docker run -t yourimage
Run Code Online (Sandbox Code Playgroud)

或使用flush参数(仅限python3):

import sys
import time
print("Begin")
sys.stdout.flush()
time.sleep(100);
print("End")
Run Code Online (Sandbox Code Playgroud)