In einer anderen Frage, Prozess Kind töten, wenn das Elternteil beendet wird , erhielt ich die Antwort, die dazu beitrug, dies zu klären.
Auf diese Weise konfigurieren wir die Anwendung so, dass sie in einer Datei protokolliert und kontinuierlich ausgeführt tail -f
wird. Zum Glück tail
kann akzeptieren --pid PID
: Es wird beendet, wenn der angegebene Prozess beendet wird. Wir setzen $$
dort: PID der aktuellen Shell.
Als letzter Schritt wird die gestartete Anwendung exec
bearbeitet, was bedeutet, dass die aktuelle Shell vollständig durch diese Anwendung ersetzt wird.
Das Runner-Skript run.sh
sieht folgendermaßen aus:
#! /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
HINWEIS: Bei Verwendung von tail -F
listen wir die Dateinamen auf und sie werden gelesen, auch wenn sie später erscheinen!
Zum Schluss das minimalistische Dockerfile:
FROM ubuntu
ADD run.sh /root/run.sh
CMD ['/root/run.sh']
Hinweis: Um ein ungewöhnliches tail -f
Verhalten zu vermeiden ("wurde durch eine entfernte Datei ersetzt. Diesen Namen aufgeben"), habe ich einen anderen Ansatz gewählt: Alle bekannten Protokolldateien werden beim Start erstellt und abgeschnitten. Auf diese Weise stelle ich sicher, dass sie existieren und erst dann - schwinge sie:
#! /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