2017-08-27 2 views
0

Ich versuche zu versuchen, die Protokolldateien von Docker-Containern in this site zu speichern, die Ihnen eine Linux-Root-Shell mit installiertem Docker gibt. I'v verwendete Lösung here bereitgestellt:das Speichern von Docker-Protokolldateien mit Volumes erzeugt die Berechtigung verweigert

docker run -ti -v /dev/log:/root/data --name zizimongodb mongo 

Dies ist, was ich in der Konsole bekam:

docker: Error response from daemon: oci runtime error: container_linux.go:262: starting container process caused "process_linux.go:339: container init caused \"rootfs_linux.go:57: mounting \\\"/dev/log\\\" to rootfs \\\"/graph/overlay2/7f1eb83902e3688c0a1204c2fe8dfd8fbf43e1093bc578e4c41028e8b03e4b38/merged\\\" at \\\"/graph/overlay2/7f1eb83902e3688c0a1204c2fe8dfd8fbf43e1093bc578e4c41028e8b03e4b38/merged/root/data\\\" caused \\\"permission denied\\\"\"". 

Aber der Behälter hat begonnen:

$ docker ps -a 
CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS    NAMES 
8adaa75ba6f7  mongo    "docker-entrypoint..." 2 minutes ago  Created         zizimongodb 

docker logs -f zizimongodb kehrt nichts. Wenn ich den Container stoppe, wird im /root/data nichts gespeichert. Irgendeine Idee, wie ich alle Protokolle korrekt speichern kann?

+0

Warum verwenden Sie '/ dev/log'? Versuchen Sie es mit '/ var/log/mongodb:/root/data' –

+0

@TarunLalwani, vor allem habe ich viele Komponenten, die ich ihre Protokolle aus ihren Containern erhalten möchten; Ich möchte Docker Logs speichern, um auf alle zugreifen zu können. Zweitens habe ich Ihren Vorschlag ausprobiert, nach dem Anhalten und dem Entfernen des Containers wurde nichts gespeichert. –

+0

Das liegt daran, dass 'mongo' keine Logs an'/root/data' teilt. Wenn Sie den mongodb-Container überprüfen, werden die Protokolle an '/ var/log/mongodb/mongod.log' gesendet. Also warum erwartest du, dass es funktioniert? –

Antwort

0

Da Sie das offizielle Mongo-Bild von DockerHub verwenden, ist es erwähnenswert, dass dieses offizielle Bild (wie viele - oder alle? - der offiziellen Bilder) keine Protokollausgabe an das Standardprotokoll sendet Orte, die Sie möglicherweise erwarten, wenn Sie eine Linux-Distributionsversion der gleichen Software herunterladen.

Stattdessen wird die meiste Software, die in der Lage ist zu sagen, wo zu loggen, gezwungen, zu stdout/stderr zu loggen, so dass docker log plugins und der docker log Befehl selbst richtig funktionieren.

Für den Fall, dass Sie mongodb diesen etwas komplizierten Code sehen here, die den Prozess mongodb erzählt das /proc Dateisystem Dateideskriptor zu verwenden, die auf „stdout“ abbildet, solange es beschreibbar ist, wenn der Behälter gestartet wird. Wegen einiger Bugs ist das komplizierter als andere Dockerfile Anpassung der Log-Ausgabe (Sie können mehr lesen, wenn Sie an den Links in den Kommentaren interessiert sind).

Ich denke, ein vernünftigerer Weg zu versuchen und eine Form der Protokollkonsolidierung oder Sammlung zu tun ist, lesen Sie über docker log drivers und sehen, ob eine dieser Optionen für Sie funktioniert. Wenn Sie beispielsweise journald möchten, gibt es einen Treiber, der alle Containerprotokolle übernimmt und sie an journald auf dem Host weitergibt.