我正在观看一个关于将我的Django应用程序docker化的教程。我不明白为什么我们在Dockerfile中使用PYTHONUNBUFFERED作为环境变量。
有人能解释一下吗?
有人能解释一下吗?
将 PYTHONUNBUFFERED
设置为非 0 的非空值可以确保 python 输出即 stdout
和 stderr
流直接发送到终端(例如容器日志),无需先缓冲,并且可以实时查看应用程序的输出(例如 django 日志)。
这还确保了在 python 应用程序崩溃的情况下,没有部分输出被保留在某个缓冲区中并被忽略。
由于这已经在几个评论和补充回答中提到过,请注意 PYTHONUNBUFFERED
对输入(即 stdin
流)完全没有影响。
换句话说,在 docker 容器中关闭 stdout/stderr 的缓冲主要是获取尽可能多的信息并在容器日志中尽快显示运行应用程序的输出,以防止在应用程序崩溃时丢失任何东西。
请注意,关闭缓冲可能会对性能产生影响,具体取决于您的硬件/环境。但大多数情况下影响都不会太大(除非您有较慢的磁盘或正在编写大量日志,或者不好地想要配置 docker 守护程序将日志写入较慢的网络驱动器中...)。如果有这方面的顾虑,可以保留缓冲区并在需要时直接从应用程序刷新缓冲区。有关此主题,请参阅以下第 4 链接。
参考文献:
PYTHONUNBUFFERED
值会强制stdout和stderr流不被缓冲。这个选项对stdin流没有影响。这将指示 Python 以非缓冲模式运行,当在 Docker 容器内使用 Python 时,推荐使用此模式。原因是它不允许 Python 缓冲输出;相反,直接打印输出,避免了运行 Python 应用程序时 Docker 镜像中的某些复杂性。
PYTHONUNBUFFERED=0
具有与未设置或为空字符串相同的效果。这是因为 CPython 尝试使用strtol(3)
(完全字符串匹配)解析环境变量。 - iBug