Docker 容器中的標準輸出緩衝
Docker 容器中的標準輸出緩衝可能會導致在容器中執行程式碼時延遲輸出顯示。在某些情況下,stdout 輸出可能只是間歇性地可見,給人的印像是輸出正在分塊刷新。
出現此問題的原因是,與在主機上運行時相比,Linux 在容器中處理緩衝的方式不同。預設情況下,容器中的 stdout 是緩衝的,這表示輸出將儲存在緩衝區中,直到達到一定大小或遇到換行符。在需要即時輸出的情況下,這種緩衝行為可能會出現問題。
此問題的解決方案是停用容器中 stdout 的緩衝。實現此目的的一種方法是使用 stdbuf 實用程式。然而,這種方法可能並不總是可行或有效。
<code class="go"> cmd := exec.Command("ping", "127.0.0.1") logger := &lumberjack.Logger{ Filename: conf.LogFile, MaxSize: conf.MaxLogSizeMb, MaxBackups: conf.MaxLogBackups, MaxAge: conf.MaxLogAgeDays, } cmd.Stdout = io.MultiWriter(os.Stdout, logger) cmd.Stderr = os.Stderr // Fixes buffering in containers err := cmd.Run()</code>
透過明確將指令的 Stderr 流設為 os.Stderr,可以停用 stdout 和 stderr 的緩衝。這確保了無論容器環境如何,子進程的輸出都會即時顯示。
需要注意的是,stdout 緩衝的行為可能會根據所使用的基礎映像而有所不同。不同的 Linux 發行版以不同的方式處理緩衝,這可能會導致容器之間的行為不一致。始終在預期的生產環境中測試您的程式碼,以確保正確的標準輸出處理。
以上是為什麼我的輸出在 Docker 容器中出現延遲?了解和修復標準輸出緩衝的指南。的詳細內容。更多資訊請關注PHP中文網其他相關文章!