簡體   English   中英

為什么`docker run -t`可以讓python刷新輸出緩沖區?

[英]Why `docker run -t` could make python flush the output buffer?

1.

Dockerfile:

FROM python:3
CMD ["python", "-m", "http.server"]

當我接下來執行時,您可以看到沒有日志可以看到。

shubuntu1@shubuntu1:~/77$ docker build -t a:1 . --no-cache
...
Successfully tagged a:1
shubuntu1@shubuntu1:~/77$ docker run -d --name test a:1
9638189c0528fc98524b0b2f7bec72269186a3445795f0fcf974751a0d908f44
shubuntu1@shubuntu1:~/77$ docker logs test
shubuntu1@shubuntu1:~/77$

2.

我在上面掙扎了一段時間,最后發現這是因為程序緩沖區問題,所以我可以解決下一個問題:

Dockerfile:

FROM python:3
CMD ["python", "-u", "-m", "http.server"]

現在與-u

shubuntu1@shubuntu1:~/77$ docker build -t a:1 . --no-cache
...
Successfully tagged a:1
shubuntu1@shubuntu1:~/77$ docker rm -f test
test
shubuntu1@shubuntu1:~/77$ docker run -d --name test a:1
68bc759a54ec3218b39e51404495a28d010a798b1d1e160ec7f68be3b18da9c7
shubuntu1@shubuntu1:~/77$ docker logs test
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

3.

但是當我在情況 1 下回滾Dockerfile時:

Dockerfile:

FROM python:3
CMD ["python", "-m", "http.server"]

我發現在docker run使用-t ,緩沖區也如下刷新:

shubuntu1@shubuntu1:~/77$ docker build -t a:1 . --no-cache
...
Successfully tagged a:1
shubuntu1@shubuntu1:~/77$ docker rm -f test
test
shubuntu1@shubuntu1:~/77$ docker run -dt --name test a:1
f7cd1b5b3c272ff42c7aecd251e324b70030c046489048370689ba25b33191cc
shubuntu1@shubuntu1:~/77$ docker logs test
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

所以,我的問題是:為什么-t有這種效果?

使用-t/--tty運行 docker 容器似乎將偽終端附加到容器中的進程。

如果 stdout 描述符附加到終端,則它是行緩沖的。
假設用戶正在監視終端以獲取進程的輸出; 經常打印數據被認為很重要。 一旦遇到換行符 ( \\n )、緩沖區填滿或進程結束,緩沖區就會被刷新。

如果 stdout 附加到與終端不同的東西,則流被完全(或塊)緩沖。 在 libc/glibc 上,默認緩沖區大小為 4096 字節。 緩沖區必須在其內容被刷新之前填滿。
當假設寫入 stdout 的數據將在稍后檢查(例如日志文件)時,這會減少昂貴的寫入系統調用的數量。

又見標准輸出緩沖埃文Klitzke,在標准流進行緩沖由哈靈頓布雷迪和標准輸出手冊頁

暫無
暫無

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

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