Ich stelle eine Drittanbieteranwendung gemäß dem 12-Faktor- Hinweis bereit. Einer der Punkte besagt, dass Anwendungsprotokolle in stdout / stderr gedruckt werden sollten. Dann kann die Cluster-Software sie erfassen.
Die Anwendung kann jedoch nur in Dateien oder Syslog schreiben. Wie drucke ich diese Protokolle stattdessen aus?
Antworten:
Ein erstaunliches Rezept finden Sie in der Nginx Docker-Datei :
Die App kann einfach weiter als Datei darauf schreiben, die Zeilen gehen dann jedoch zu
stdout
&stderr
!quelle
squid3
, und es hat dann Probleme mit Berechtigungen auf/dev/stdout
.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ücktail
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: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:
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:quelle
tail
Programm löst ähnliche Probleme mit Alpine und scheint auf BusyBox ohne die Option --pid problemlos zu funktionieren.Für einen Hintergrundprozess in einem Docker-Container, zB Verbinden mit exec nach / bin / bash, konnte ich verwenden.
Dadurch wird die Ausgabe an die Standardausgabe von PID 1 gesendet, bei der es sich um die einzige Docker-Abholung handelt.
quelle
docker logs
oder nicht angezeigtkubectl logs
. Ich habe einen Container, der Task über Crontab plant, der nicht als PID1 ausgeführt wird.für nginx kann man darauf
nginx.conf
zeigen/dev/stderr
und das/dev/stdout
mögenund Ihr
Dockerfile
Eintrag sollte seinquelle
root