Dans une autre question, Tue le processus enfant quand le parent sort J'ai reçu la réponse qui m'a aidé à résoudre ce problème.
De cette façon, nous configurons l'application pour qu'elle enregistre dans un fichier, et en permanence tail -f
il. Heureusement, tail
peut accepter --pid PID
il se terminera lorsque le processus spécifié se terminera. Nous mettons $$
là : PID du Shell actuel.
Dans une dernière étape, l'application lancée est exec
'ed, ce qui signifie que le Shell actuel est complètement remplacé par cette application.
Runner script, 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
on liste les noms de fichiers, et il les lira même s'ils apparaissent plus tard !
Enfin, le Dockerfile minimaliste :
FROM ubuntu
ADD run.sh /root/run.sh
CMD ['/root/run.sh']
Note : pour travailler sur des sujets extrêmement étranges tail -f
J'ai essayé une autre approche : tous les fichiers journaux connus sont créés et tronqués au démarrage : de cette façon, je m'assure qu'ils existent, et seulement ensuite, je les tronque :
#! /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
0 votes
Ils vont déjà dans le syslog. Vous pouvez simplement les récupérer à partir de là !
0 votes
@MichaelHampton, cela semble bien, mais Docker exécute un seul processus qui peut écrire sur stdout, et cela ressemble à la combinaison de deux d'entre eux ?
1 votes
Vous pouvez avoir un processus démon qui utilise syslog et avoir un processus frontal qui imprime ?