Je déploie une application tierce conformément à l'avis 12 , et l'un des points indique que les journaux d'application doivent être imprimés sur stdout / stderr: les logiciels de clustering peuvent le collecter.
Cependant, l'application ne peut écrire que dans des fichiers ou dans syslog. Comment puis-je imprimer ces journaux à la place?
Réponses:
Une recette étonnante est donnée dans le Dockerfile de nginx :
Simplement, l'application peut continuer à écrire dans un fichier, mais les lignes iront à
stdout
&stderr
!la source
squid3
, et il a ensuite des problèmes avec les autorisations sur/dev/stdout
.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: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:
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:la source
tail
Cela résout des problèmes similaires avec alpine et semble bien fonctionner sur BusyBox sans l'option --pid.Pour un processus en arrière-plan dans un conteneur de menu fixe, par exemple, la connexion avec exec à / bin / bash, je pouvais utiliser.
Cela envoie la sortie à la sortie standard du pid 1, qui est le premier docker capté.
la source
docker logs
oukubectl logs
. J'ai un conteneur qui planifie la tâche via crontab qui ne s'exécute pas en tant que PID1.pour nginx vous pouvez avoir en
nginx.conf
montrant/dev/stderr
et/dev/stdout
comme celui - ciet votre
Dockerfile
entrée devrait êtrela source
root