Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Stdout Buffering Berlaku dalam Bekas Docker?

Mengapa Stdout Buffering Berlaku dalam Bekas Docker?

DDD
DDDasal
2024-10-29 20:42:02227semak imbas

Why Does Stdout Buffering Occur in Docker Containers?

Penimbalan stdout dalam Bekas Docker

Masalah:

Menjalankan proses dalam bekas Docker boleh menghasilkan output stdout yang ditimbal, tidak seperti apabila proses itu dilaksanakan pada hos atau pada macOS. Tingkah laku tidak konsisten ini diperhatikan apabila menggunakan Go 1.6.3 dan amat ketara dalam bekas berdasarkan imej Debian.

Analisis:

Isunya terletak pada gelagat penimbalan stdout daripada bekas itu. Secara lalai, stdout ditimbal dalam bekas Docker, bermakna output dikumpul sehingga had tertentu dicapai atau flush dicetuskan. Ini boleh menyebabkan output terputus-putus apabila menjalankan proses yang menjana sejumlah besar data.

Punca:

Penimbalan stdout ialah ciri kernel Linux yang diwarisi oleh Docker bekas. Ia mengoptimumkan prestasi sistem dengan mengurangkan bilangan penulisan pada sistem fail hos.

Penyelesaian:

Terdapat beberapa cara untuk mengatasi penimbalan stdout dalam bekas Docker:

  • Gunakan stdbuf: Alat stdbuf boleh digunakan untuk memaksa stdout yang tidak dibuffer. Tambahkan stdbuf -o0 sebelum arahan yang menyebabkan isu penimbalan.
  • Tetapkan pembolehubah persekitaran nyahpenimbal: Menetapkan pembolehubah persekitaran nyahpenimbalan kepada benar akan melumpuhkan penimbalan untuk semua proses anak.
  • Ubah suai kod sumber: Jika proses yang dijalankan mempunyai antara muka berasaskan konsol, mungkin perlu mengubah suai kod sumber untuk mengepam stdout selepas setiap penulisan.
  • Gunakan pemacu pengelogan Docker: Menggunakan pemacu pengelogan Docker yang menyokong pengelogan masa nyata boleh membantu mengurangkan isu ini.

Contoh:

Dalam contoh yang disediakan, coretan kod berikut boleh digunakan untuk melumpuhkan penimbalan stdout:

<code class="go">cmd := exec.Command("ping", "127.0.0.1")
cmd.Stdout = io.MultiWriter(os.Stdout, logWriter)
cmd.Env = append(os.Environ(), "unbuffer=true")
err := cmd.Run()</code>

Atas ialah kandungan terperinci Mengapa Stdout Buffering Berlaku dalam Bekas Docker?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn