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:
#! /usr/bin/env bash
set -eu
rm -rf /var/log/my-application.log
tail --pid $$ -F /var/log/my-application.log &
exec /path/to/my-application --logfile /var/log/my-application.log
CATATAN: dengan menggunakan tail -F
kami daftar nama file, dan itu akan membacanya bahkan jika mereka muncul nanti!
Akhirnya, Dockerfile minimalis:
FROM ubuntu
ADD run.sh /root/run.sh
CMD ['/root/run.sh']
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:
#! /usr/bin/env bash
set -eu
LOGS=/var/log/myapp/
( umask 0 && truncate -s0 $LOGS/http.{access,error}.log )
tail --pid $$ -n0 -F $LOGS/* &
exec /usr/sbin/apache2 -DFOREGROUND