簡體   English   中英

docker-compose 不在 Python 應用程序中打印標准輸出

[英]docker-compose not printing stdout in Python app

在由 Docker Compose 管理的 Docker 容器內運行的 Python 應用程序中使用print()語句時,僅記錄sys.stderr輸出。 沒有看到 Vanilla print()語句,所以這個:

print("Hello? Anyone there?")

...永遠不會出現在常規日志中:

在此處輸入圖片說明

(您可以在我的應用程序中看到由其他庫顯式打印的其他日志,但沒有我自己的調用。)

如何避免我的print()調用被忽略?

默認情況下,Python 將輸出緩沖到sys.stdout

有幾個選項:

1. 調用顯式flush

重構原始打印語句以包含一個flush=True關鍵字,例如:

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

注意:這將導致整個緩沖區刷新,而不僅僅是相同的打印調用。 因此,如果其他地方有“裸”打印函數調用(即沒有flush=True )沒有明確無緩沖,這些也將始終被刷新。

您可以通過以下方式實現相同的目的:

import sys
sys.stdout.flush()

如果您希望最大程度地控制何時發生沖洗,則此選項很有用。

2. 通過PYTHONUNBUFFERED env var PYTHONUNBUFFERED整個應用程序的緩沖

將以下內容放入docker-compose.yml文件的environment部分:

PYTHONUNBUFFERED: 1

這將導致立即刷新stdout所有輸出。

3. 使用-u運行 python

與上面的選項 #2 一樣,這將導致 Python 在應用程序的整個執行生命周期內“無緩沖”地運行。 只需運行python -u <entrypoint.py> - 不需要環境變量。

很簡單,如果您在 Dockerfile 的行中添加選項 -u,它將打印您的日志:

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

無需更改環境變量或更改程序的所有打印語句。

使用pytest ,我的解決方案是添加-s選項。

例如,在我還需要啟用詳細模式的場景中,我不得不放置pytest -sv

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM