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:
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!