Dans une autre question, processus enfant Kill lorsque le parent quitte , j'ai eu la réponse qui a aidé à résoudre ce problème.
De cette façon, nous configurons l’application pour qu’elle se connecte à un fichier et en continu tail -f
. Heureusement, tail
peut accepter --pid PID
: il se fermera à la fin du processus spécifié. Nous $$
y mettons : PID du shell actuel.
Enfin, l’application lancée est exec
'ed, ce qui signifie que le shell actuel est complètement remplacé par cette application.
Le script du coureur run.sh
ressemblera à ceci:
#! /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
NOTE: en utilisant tail -F
nous listons les noms de fichiers, et ils les liront même s'ils apparaissent plus tard!
Enfin, le fichier minimaliste Dockerfile:
FROM ubuntu
ADD run.sh /root/run.sh
CMD ['/root/run.sh']
Remarque: pour éviter un tail -f
comportement extrêmement étrange (qui dit "a été remplacé par un fichier distant. Abandonnant ce nom"), j’ai essayé une autre approche: tous les fichiers journaux connus sont créés et tronqués au démarrage: de cette manière, je les vérifie. , et alors seulement - les suivre:
#! /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