Başka bir soruda, ebeveyn çıkarken çocuk sürecini öldürün , bunu çözmede yardımcı olan cevabı aldım.
Bu şekilde, uygulamayı bir dosyaya kaydedecek şekilde yapılandırdık ve sürekli olarak uygulayalım tail -f
. Neyse ki, tail
kabul edebilir --pid PID
: belirtilen işlemden çıktığında çıkacaktır. $$
Orada koyduk : Geçerli kabuğun PID değeri.
Son bir adım olarak, başlatılan uygulama exec
onaylanır; bu, mevcut kabuğun tamamen bu uygulamayla değiştirildiği anlamına gelir.
Runner betiği run.sh
şöyle görünecek:
#! /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
NOT: kullanarak tail -F
dosya isimlerini listeleriz ve daha sonra ortaya çıksalar bile onları okuyacaktır!
Son olarak, minimalist Dockerfile:
FROM ubuntu
ADD run.sh /root/run.sh
CMD ['/root/run.sh']
Not: Bazı son derece garip tail -f
davranışları gidermek için ("uzak bir dosyayla değiştirildi. Bu isimden vazgeçiliyor" diyor) başka bir yaklaşım denedim: Bilinen tüm günlük dosyaları başlangıçta oluşturuldu ve kesildi: bu şekilde var olduklarını garanti ediyorum ve yalnızca o zaman - onları kuyruk:
#! /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