wake-up-neo.net

Wie lösche ich die Protokolle für einen Docker-Container richtig?

Ich verwende docker logs [container-name], um die Protokolle eines bestimmten Containers anzuzeigen.

Gibt es eine elegante Möglichkeit, diese Protokolle zu löschen?

139
Youssouf Maiga

Aus dieser Frage gibt es einen Einzeiler, den Sie ausführen können:

echo "" > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)

Ich bin kein großer Fan davon, Docker-Dateien direkt mit diesem Befehl, einem Kürzungsbefehl oder einer Protokolldrehung zu ändern, da sich beide außerhalb von Docker befinden. Das Löschen von externen Protokollen kann passieren, während Docker mit JSON formatierte Daten in die Datei schreibt, was zu einer Teilzeile führt und die Fähigkeit zum Lesen von Protokollen aus dem docker logs -Cli beeinträchtigt.

Stattdessen kann Docker die Protokolle automatisch für Sie drehen. Dies geschieht mit zusätzlichen Flags für dockerd, wenn Sie den Standard-JSON-Protokolliertreiber verwenden :

dockerd ... --log-opt max-size=10m --log-opt max-file=3

Sie können dies auch als Teil Ihrer Datei daemon.json festlegen, anstatt Ihre Startskripte zu ändern:

{
  "log-driver": "json-file",
  "log-opts": {"max-size": "10m", "max-file": "3"}
}

Stellen Sie sicher, dass Sie systemctl reload docker ausführen, nachdem Sie diese Datei geändert haben, damit die Einstellungen übernommen werden. Diese Einstellung ist dann die Standardeinstellung für alle neu erstellten Container. Vorhandene Container müssen gelöscht und neu erstellt werden, um die neuen Protokollgrenzwerte zu erhalten. Ähnliche Protokolloptionen können an einzelne Container übergeben werden, um diese Standardeinstellungen zu überschreiben, sodass Sie mehr oder weniger Protokolle für einzelne Container speichern können.

172
BMitch

Verwenden:

truncate -s 0 /var/lib/docker/containers/*/*-json.log

Referenz: Kürzen einer Datei während der Verwendung (Linux)

160
duketwo
Sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
29
richard

Sie können logrotate einrichten, um die Protokolle regelmäßig zu löschen.

Beispieldatei in /etc/logrotate.d/docker-logs

/var/lib/docker/containers/*/*.log {
 rotate 7
 daily
 compress
 size=50M
 missingok
 delaycompress
 copytruncate
}
24
AlexPnt

Sie können dies nicht direkt über einen Docker-Befehl ausführen.

Sie können entweder die Größe des Protokolls begrenzen oder mithilfe eines Skripts Protokolle löschen, die sich auf einen Container beziehen. Beispiele für Skripte finden Sie hier (von unten gelesen): Feature: Möglichkeit zum Löschen des Protokollverlaufs # 108

Lesen Sie den Abschnitt Protokollierung in der Docker-Compose-Dateireferenz, in der Sie Optionen (z. B. Protokollrotation und Protokollgrößenbeschränkung) für einige Protokolltreiber angeben können.

9
Tristan

Unter Docker unter Windows und wahrscheinlich auch unter anderen ist es möglich, die Option tail zu verwenden.

z.B. Docker-Protokolle -f --tail 100 msftmodbus

Auf diese Weise werden nur die letzten 100 Zeilen angezeigt, und Sie müssen nicht zuerst durch 1 Million Zeilen scrollen.

(Daher ist das Löschen des Protokolls wahrscheinlich nicht erforderlich.)

8
Egbert Nierop

Docker4Mac, eine 2018 Lösung:

LOGPATH=$(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
docker run -it --rm --privileged --pid=Host Alpine:latest nsenter -t 1 -m -u -n -i -- truncate -s0 $LOGPATH

In der ersten Zeile wird der Pfad der Protokolldatei angezeigt, ähnlich wie bei der akzeptierten Antwort.

In der zweiten Zeile wird nsenter verwendet, mit dem Sie Befehle auf dem xhyve VM ausführen können, der als Host für alle Docker-Container unter Docker4Mac fungiert. Der Befehl, den wir ausführen, ist der vertraute truncate -s0 $LOGPATH von Nicht-Mac-Antworten.

Wenn Sie docker-compose verwenden, wird die erste Zeile zu:

local LOGPATH=$(docker inspect --format='{{.LogPath}}' $(docker-compose ps -q <service>))

und <service> ist der Servicename aus Ihrer docker-compose.yml -Datei.

Vielen Dank an https://github.com/justincormack/nsenter1 für den Trick nsenter.

8
elifiner

Versuchen Sie als root Benutzer Folgendes auszuführen:

>  /var/lib/docker/containers/*/*-json.log

oder

cat /dev/null > /var/lib/docker/containers/*/*-json.log

oder

echo "" > /var/lib/docker/containers/*/*-json.log
5
matson kepson

Auf meinen Ubuntu-Servern würde ich sogar als Sudo Cannot open ‘/var/lib/docker/containers/*/*-json.log’ for writing: No such file or directory bekommen

Das Kämmen des Dockers zum Überprüfen und Abschneiden von Antworten hat jedoch funktioniert:

Sudo truncate -s 0 `docker inspect --format='{{.LogPath}}' <container>`
2
aqwan

Docker für Mac-Benutzer, hier ist die Lösung:

    1. Suchen des Protokolldateipfads nach:

      $ docker inspect | grep log

    1. SSH in den Docker einbinden (Angenommen, der Name ist default, andernfalls docker-machine ls ausführen, um dies herauszufinden):

      $ docker-machine ssh default

    1. Wechseln Sie zu root ( Referenz ):

      $ Sudo -i

    1. Löschen Sie den Inhalt der Protokolldatei:

      $ echo "" > log_file_path_from_step1

0
Jinsong Li