In einer anderen Frage, Kindprozess beenden, wenn der übergeordnete Prozess beendet wird, Ich habe die Antwort bekommen, die geholfen hat, das zu klären.
Auf diese Weise konfigurieren wir die Anwendung so, dass sie sich kontinuierlich in einer Datei anmeldet tail -f
es. Glücklicherweise, tail
kann annehmen --pid PID
: es wird beendet, wenn der angegebene Prozess beendet wird. Wir setzen $$
dort: PID der aktuellen Shell.
Als letzten Schritt wird die gestartete Anwendung exec
'ed, was bedeutet, dass die aktuelle Shell vollständig durch diese Anwendung ersetzt wird.
Runner-Skript, run.sh
, wird so aussehen:
#! /usr/bin/env bashset -eurm -rf /var/log/my-application.logtail --pid $$ -F /var/log/my-application.log &exec /path/to/my-application --logfile /var/log/my-application.log
HINWEIS: durch die Verwendung von tail -F
wir listen Dateinamen auf, und es wird sie lesen, auch wenn sie später erscheinen!
Schließlich das minimalistische Dockerfile:
FROM ubuntuADD run.sh /root/run.shCMD ['/root/run.sh']
Hinweis: um einige extrem seltsame Probleme zu umgehen tail -f
verhalten (das besagt "wurde durch eine Remote-Datei ersetzt. diesen Namen aufgeben ") Ich habe einen anderen Ansatz ausprobiert: Alle bekannten Protokolldateien werden beim Start erstellt und abgeschnitten: Auf diese Weise stelle ich sicher, dass sie existieren, und erst dann -- tail:
#! /usr/bin/env bashset -euLOGS=/var/log/myapp/( umask 0 && truncate -s0 $LOGS/http.{access,error}.log )tail --pid $$ -n0 -F $LOGS/* &exec /usr/sbin/apache2 -DFOREGROUND