2016-06-29 7 views
4

Ich habe ein Skript, das 10 Container im Hintergrundmodus startet (fig-up Option -d). Ich möchte das stdout oder das Log in/var/log von allen von ihnen zusammenbringen. Wie kann ich das machen?Endlosausgabe von mehreren Docker-Containern

Die Behälter werden mit verschiedenen Docker-compose Dateien gestartet, so kann ich nicht tun Docker-komponieren bis target1 target2 ziel3

Docker Protokolle akzeptiert nur einen Container als Parameter.

Ich erwog, ein Volume aus dem Verzeichnis/var/log für alle Container zu erstellen und sie einem Verzeichnis außerhalb von Docker zuzuweisen. Stellen Sie sicher, dass die Protokolle keinen kollidierenden Namen haben und den bash tail -f * verwenden. Aber ich würde es begrüßen, eine elegantere Lösung

Antwort

4

Dieses Bash-Skript, das tun, was Sie wollen:

Docker-logs

#!/bin/bash 

while [ $# -ne 0 ] 
do 
    (docker logs -f -t --tail=10 $1|sed -e "s/^/$1: /")& 
    shift 
done 
wait 

Verbrauch:

$ docker-logs containerid1 containerid2 ... containeridN 

Der Ausgang dieses Skripts hat jede Zeile aus den protokollierten Protokollen mit der Container-ID vorangestellt.

Das Skript funktioniert im --follow Modus und muss mit Ctrl-C unterbrochen werden.

Beachten Sie, dass die Optionen docker logs im Skript fest codiert sind. Wenn Sie die Optionen von docker logs über die Befehlszeile steuern können, müssen Sie die Befehlszeilenargumente analysieren (z. B. mit getopts).

0

Docker unterstützt nicht als 1.12 noch. Aber ich habe einen Workaround via bash;

Ich benutze Docker Swarm-Modi kommt mit 1.12 und Bereitstellung vieler Replikation. Daher enthalten alle meine Container einen gemeinsamen Text, der dem Servicenamen entspricht. Um all seine Protokolle in einem Andockknoten zu beenden, verwende ich dies auf jedem Andockknoten. filter-text wird nur meine Container filtern.

Wenn Sie aufhören wollen, funktioniert das für mich;

pkill -f 'docker logs'