Saya menggunakan aplikasi pihak ke-3 sesuai dengan saran faktor 12 , dan salah satu poin mengatakan bahwa log aplikasi harus dicetak ke stdout / stderr: maka perangkat lunak pengelompokan dapat mengumpulkannya.
Namun, aplikasi hanya dapat menulis ke file atau syslog. Bagaimana cara mencetak log ini sebagai gantinya?
Jawaban:
Resep luar biasa diberikan di nginx Dockerfile :
Sederhananya, aplikasi dapat terus menulis sebagai file, tetapi sebagai hasilnya, barisnya akan masuk ke
stdout
&stderr
!sumber
squid3
, dan kemudian mengalami masalah dengan izin/dev/stdout
.Dalam pertanyaan lain, Bunuh proses anak ketika orang tua keluar , saya mendapat respons yang membantu menyelesaikan masalah ini.
Dengan cara ini, kami mengkonfigurasi aplikasi sehingga log ke file, dan terus menerus
tail -f
. Untungnya,tail
dapat menerima--pid PID
: itu akan keluar ketika proses yang ditentukan keluar. Kami menempatkan di$$
sana: PID dari shell saat ini.Sebagai langkah terakhir, aplikasi yang diluncurkan adalah
exec
'ed, yang berarti bahwa shell saat ini sepenuhnya diganti dengan aplikasi itu.Script pelari
run.sh
,, akan terlihat seperti ini:CATATAN: dengan menggunakan
tail -F
kami daftar nama file, dan itu akan membacanya bahkan jika mereka muncul nanti!Akhirnya, Dockerfile minimalis:
Catatan: untuk mengatasi beberapa
tail -f
perilaku yang sangat aneh (yang mengatakan "telah diganti dengan file jarak jauh. Menyerah pada nama ini") saya mencoba pendekatan lain: semua file log yang dikenal dibuat & dipotong pada saat start up: dengan cara ini saya memastikan mereka ada , dan hanya kemudian - membuntuti mereka:sumber
tail
tanpa opsi --pid.Untuk proses latar belakang dalam wadah buruh pelabuhan, mis. Menghubungkan dengan exec ke / bin / bash yang bisa saya gunakan.
Ini mengirimkan output ke stdout dari pid 1, yang merupakan satu buruh pelabuhan naik.
sumber
docker logs
ataukubectl logs
. Saya punya wadah yang menjadwalkan tugas melalui crontab yang tidak berjalan sebagai PID1.untuk nginx Anda dapat
nginx.conf
menunjuk/dev/stderr
dan/dev/stdout
menyukai inidan
Dockerfile
entri Anda seharusnyasumber
root