我当时在看一个关于dockerize Django应用程序的教程。我不明白为什么在Dockerfile中使用PYTHONUNBUFFERED作为环境变量。

你能帮帮我吗?


当前回答

PYTHONUNBUFFERED非空值强制将stdout和stderr流取消缓冲。这个选项对stdin流没有影响

其他回答

将PYTHONUNBUFFERED设置为一个非空值,而不是0,可以确保python输出,即stdout和stderr流直接发送到终端(例如容器日志),而不需要首先缓冲,并且您可以实时看到应用程序的输出(例如django日志)。

这也确保了没有部分输出保存在某个缓冲区中,并且不会写入以防python应用程序崩溃。

由于在一些评论和补充回答中提到了这一点,请注意PYTHONUNBUFFERED对输入(即stdin流)绝对没有影响。

换句话说,在docker容器中关闭对stdout/stderr的缓冲,主要是为了在容器日志中尽可能快地从运行中的应用程序中获取信息,并且在崩溃时不会丢失任何东西。

注意,关闭缓冲会对性能产生影响,具体取决于您的硬件/环境。同时,在大多数情况下,它应该是次要的(除非您的磁盘很慢,或者正在写入大量的日志,或者有一个坏主意,配置您的docker守护进程写入您的日志在一个缓慢的网络驱动器…)。如果这是一个问题,缓冲可以保持打开状态,并且在需要时可以直接从应用程序刷新缓冲区。关于这个主题,请参阅下面的链接[4]。

引用:

[1] https://docs.python.org/3/using/cmdline.html#envvar-PYTHONUNBUFFERED [2] https://alphacoder.xyz/dockerizing-django/ [3] https://towardsdatascience.com/how-to-contain-your-first-django-in-docker-and-access-it-from-aws-fdb0081bdf1d [4] https://github.com/aws/amazon-sagemaker-examples/issues/319

PYTHONUNBUFFERED非空值强制将stdout和stderr流取消缓冲。这个选项对stdin流没有影响

这指示Python以UNBUFFERED模式运行,当在Docker容器中使用Python时,建议使用这种模式。这样做的原因是它不允许Python缓冲输出;相反,它直接打印输出,避免了运行Python应用程序时docker映像中的一些复杂情况。