Docker-Container-Protokolle löschen

David Mbochi Njonge 12 Oktober 2023
  1. Erstellen Sie ein neues Projekt
  2. Definiere ein Bild
  3. Erstellen Sie ein Bild
  4. Führen Sie einen Container aus
  5. Überprüfen Sie die Containerprotokolle
  6. Überprüfen Sie die Containerprotokolle in der Protokolldatei
  7. Löschen Sie Docker-Container-Protokolle mit dem Befehl echo
  8. Löschen Sie Docker-Container-Protokolle mit dem Befehl truncate
  9. Löschen Sie Docker-Container-Protokolle mithilfe der Protokollrotation
  10. Abschluss
Docker-Container-Protokolle löschen

Protokolle sind Informationen, die von der Anwendung protokolliert werden, wenn ein bestimmtes Ereignis oder ein bestimmter Zustand eintritt, und sie helfen uns, die Anwendung zu überwachen und die erforderlichen Maßnahmen zu ergreifen.

Protokolle helfen uns beispielsweise zu wissen, ob der Anwendungsstatus aktiv oder inaktiv ist, wenn wir eine Anwendung in der Produktion bereitstellen. Wenn ein Fehler auftritt, können wir die Art des aufgetretenen Fehlers anhand der Protokolle identifizieren.

Mit diesen Informationen können wir die erforderlichen Änderungen vornehmen, um die Fehler zu beheben. In einer großen Anwendung, die von vielen Personen verwendet wird, kann es schwierig sein, die Protokolle zu verwalten, aber wenn wir Docker verwenden, können wir die Protokolle einfach verwalten, da es Funktionen bietet, die helfen, die Protokolle zu manipulieren.

Docker bietet Befehle wie --details, --since, --tail, --timestamps und --until, mit denen wir die Protokolle manipulieren können. Standardmäßig speichert Docker Protokolle im JSON-Format im Ordner /var/lib/docker/containers/, aber beachten Sie, dass wir Images erstellen und ihre Container als root-Benutzer ausführen müssen, damit die Datei mit den zu erstellenden Protokollen erstellt wird .

Geschieht dies ohne Benutzerrechte root, erhalten wir den Fehler Datei oder Verzeichnis nicht gefunden. In diesem Tutorial lernen wir die verschiedenen Ansätze kennen, die wir nutzen können, um die Protokolle aus der Datei */*-json.log zu löschen.

Erstellen Sie ein neues Projekt

Öffnen Sie WebStorm IDEA und wählen Sie Datei > Neu > Projekt. Wählen Sie im geöffneten Fenster Node.js und ändern Sie den Projektnamen von unbenannt in docker-logs-clear oder verwenden Sie einen beliebigen Namen.

Drücken Sie abschließend die Schaltfläche Erstellen, um das Projekt zu generieren.

Erstellen Sie eine Datei index.js im Ordner docker-logs-clear und kopieren Sie den folgenden Code und fügen Sie ihn in die Datei ein.

console.log('This is an express application')
console.error('An error occurred')
throw new Error('An exception occurred')

Diese Datei erstellt eine STDOUT-Meldung und zwei STDERR-Meldungen, die der Protokolldatei hinzugefügt werden, wenn wir die Anwendung ausführen. Wir können diesen Code in eine Webanwendung ändern, aber beachten Sie, dass nur die Meldungen STDOUT und STDERR zur Protokolldatei hinzugefügt werden.

Definiere ein Bild

Erstellen Sie eine Datei Dockerfile im Ordner docker-logs-clear und kopieren Sie die folgenden Anweisungen und fügen Sie sie in die Datei ein.

FROM node:18-alpine
WORKDIR /com/app
ADD package*.json ./
RUN npm install
ADD . .
CMD node index.js

Hier legt FROM das Basisbild fest, auf dem unser benutzerdefiniertes Bild mit nachfolgenden Anweisungen erstellt wird. In diesem Fall haben wir alpine verwendet, um ein einfaches Image von Node als Basisimage zu verwenden.

Die Docker-Dokumentation enthält eine ausführliche Dockerfile-Referenz, in der wir mehr über die anderen Anweisungen erfahren können.

Erstellen Sie ein Bild

Beachten Sie, dass diese Phase als Root-Benutzer ausgeführt werden muss. Öffnen Sie dazu ein neues Terminalfenster mit der Tastenkombination auf Ihrem Computer und führen Sie den folgenden Befehl aus, um den aktuellen Benutzer in den Root-Benutzer zu ändern.

david@david-HP-ProBook-6470b:~/WebstormProjects/docker-logs-clear$ sudo su

Ausgang:

root@david-HP-ProBook-6470b:/home/david/WebstormProjects/docker-logs-clear#

Stellen Sie sicher, dass Sie das Verzeichnis cd in den Speicherort Ihres Projekts ändern, wie oben gezeigt, um das Image erstellen zu können. Sobald wir Zugriff auf den Root-Benutzer haben, führen Sie den folgenden Befehl aus, um ein Image mit dem Tag docker-logs:latest zu erstellen.

root@david-HP-ProBook-6470b:/home/david/WebstormProjects/docker-logs-clear# docker build --tag docker-logs:latest .

Dieser Befehl führt unser Dockerfile aus, und wir können die ausgeführten Anweisungen im Terminalfenster wie unten gezeigt anzeigen.

Step 1/6 : FROM node:18-alpine
18-alpine: Pulling from library/node
213ec9aee27d: Already exists
f379b689aea3: Pull complete
fe299d5780c0: Pull complete
c34a027bbf26: Pull complete
Digest: sha256:f829c27f4f7059609e650023586726a126db25aded0c401e836cb81ab63475ff
Status: Downloaded newer image for node:18-alpine
 ---> 867dce98a500
Step 2/6 : WORKDIR /com/app
 ---> Running in 3b215b9ad992
Removing intermediate container 3b215b9ad992
 ---> aba9cfa2472b
Step 3/6 : ADD package*.json ./
 ---> 6243ccacf178
Step 4/6 : RUN npm install
 ---> Running in 9b90745b171e

added 57 packages, and audited 58 packages in 9s

7 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
Removing intermediate container 9b90745b171e
 ---> e73c696d9743
Step 5/6 : ADD . .
 ---> e5235f761af0
Step 6/6 : CMD node index.js
 ---> Running in 7a857eea0a06
Removing intermediate container 7a857eea0a06
 ---> 29a367a3be2d
Successfully built 29a367a3be2d
Successfully tagged docker-logs:latest

Führen Sie einen Container aus

Um einen Container mit dem Image docker-logs auszuführen, führen Sie den folgenden Befehl aus, der einen Container namens docker-logs-prod ausführt. Beachten Sie, dass keine Ports verfügbar gemacht werden, da es sich nicht um eine Webanwendung handelt.

root@david-HP-ProBook-6470b:/home/david/WebstormProjects/docker-logs-clear# docker run -d --name docker-logs-prod docker-logs:latest

Überprüfen Sie die Containerprotokolle

Das Ausführen des Containers führt den Code in unserer Anwendung aus. Führen Sie den folgenden Befehl aus, um die vom Container als Ergebnis der Meldungen STDOUT und STDERR generierten Protokolle anzuzeigen.

root@david-HP-ProBook-6470b:/home/david/WebstormProjects/docker-logs-clear# docker logs -f docker-logs-prod

Ausgang:

This is an express application
An error occurred
/com/app/index.js:3
throw new Error("An exception occurred")
^

Error: An exception occurred
    at Object.<anonymous> (/com/app/index.js:3:7)
    at Module._compile (node:internal/modules/cjs/loader:1149:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1203:10)
    at Module.load (node:internal/modules/cjs/loader:1027:32)
    at Module._load (node:internal/modules/cjs/loader:868:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
    at node:internal/main/run_main_module:23:47

Node.js v18.10.0

Überprüfen Sie die Containerprotokolle in der Protokolldatei

Um zu überprüfen, ob die vorherigen Protokolle zu unserer Protokolldatei hinzugefügt wurden, verwenden Sie den folgenden Befehl, um den Speicherort der Protokolldatei zu überprüfen, an dem der Container die generierten Protokolle speichert.

root@david-HP-ProBook-6470b:/home/david/WebstormProjects/docker-logs-clear# docker inspect --format='{{.LogPath}}' docker-logs-prod

Ausgang:

/var/lib/docker/containers/1eb27be7b062346872869eaedfb250c526dc77437123dd18adf3dbb5e8b6b7da/1eb27be7b062346872869eaedfb250c526dc77437123dd18adf3dbb5e8b6b7da-json.log

Nachdem wir nun den Speicherort haben, an dem die Protokolldatei erstellt wird, führen Sie den folgenden Befehl aus, um den JSON-Inhalt der Protokolldatei zu drucken.

root@david-HP-ProBook-6470b:/home/david/WebstormProjects/docker-logs-clear# cat /var/lib/docker/containers/1eb27be7b062346872869eaedfb250c526dc77437123dd18adf3dbb5e8b6b7da/1eb27be7b062346872869eaedfb250c526dc77437123dd18adf3dbb5e8b6b7da-json.log

Ausgang:

{"log":"This is an express application\n","stream":"stdout","time":"2022-10-07T10:47:16.594937015Z"}
{"log":"An error occurred\n","stream":"stderr","time":"2022-10-07T10:47:16.596273395Z"}
{"log":"/com/app/index.js:3\n","stream":"stderr","time":"2022-10-07T10:47:16.617728515Z"}
{"log":"throw new Error(\"An exception occurred\")\n","stream":"stderr","time":"2022-10-07T10:47:16.61780931Z"}
{"log":"^\n","stream":"stderr","time":"2022-10-07T10:47:16.617822419Z"}
{"log":"\n","stream":"stderr","time":"2022-10-07T10:47:16.617832094Z"}
{"log":"Error: An exception occurred\n","stream":"stderr","time":"2022-10-07T10:47:16.617846368Z"}
{"log":"    at Object.\u003canonymous\u003e (/com/app/index.js:3:7)\n","stream":"stderr","time":"2022-10-07T10:47:16.617855581Z"}
{"log":"    at Module._compile (node:internal/modules/cjs/loader:1149:14)\n","stream":"stderr","time":"2022-10-07T10:47:16.617864838Z"}
{"log":"    at Module._extensions..js (node:internal/modules/cjs/loader:1203:10)\n","stream":"stderr","time":"2022-10-07T10:47:16.617882182Z"}
{"log":"    at Module.load (node:internal/modules/cjs/loader:1027:32)\n","stream":"stderr","time":"2022-10-07T10:47:16.617890043Z"}
{"log":"    at Module._load (node:internal/modules/cjs/loader:868:12)\n","stream":"stderr","time":"2022-10-07T10:47:16.617898124Z"}
{"log":"    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)\n","stream":"stderr","time":"2022-10-07T10:47:16.617906808Z"}
{"log":"    at node:internal/main/run_main_module:23:47\n","stream":"stderr","time":"2022-10-07T10:47:16.617914665Z"}
{"log":"\n","stream":"stderr","time":"2022-10-07T10:47:16.61792284Z"}
{"log":"Node.js v18.10.0\n","stream":"stderr","time":"2022-10-07T10:47:16.617930182Z"}

Aus dem von der Datei zurückgegebenen JSON-Inhalt können wir alle vom Container generierten Protokolle sehen, einschließlich des Streams und der Zeit, zu der das Ereignis aufgetreten ist. Im nächsten Abschnitt erfahren Sie, wie Sie Protokolle aus dieser Datei löschen.

Löschen Sie Docker-Container-Protokolle mit dem Befehl echo

Um den JSON-Inhalt aus der Protokolldatei zu löschen, führen Sie den folgenden Befehl aus, der den Befehl echo verwendet, um die Datei mit einer leeren Zeichenfolge zu überschreiben.

root@david-HP-ProBook-6470b:/home/david/WebstormProjects/docker-logs-clear# echo "" > $(docker inspect --format='{{.LogPath}}' docker-logs-prod)

Um zu überprüfen, ob unsere Protokolldatei gelöscht wurde, führen Sie den Befehl docker logs -f docker-logs-prod aus und beachten Sie, dass er keine Protokolle aus der Datei zurückgibt.

Löschen Sie Docker-Container-Protokolle mit dem Befehl truncate

Führen Sie den vorherigen Container erneut aus, um die Protokolle erneut zu generieren, und führen Sie den folgenden Befehl aus, um die zur Protokolldatei hinzugefügten Protokolle zu löschen. Dieser schrumpft die Datei mit dem Befehl truncate auf die Grösse 0.

root@david-HP-ProBook-6470b:/home/david/WebstormProjects/docker-logs-clear# truncate -s 0 $(docker inspect --format='{{.LogPath}}' docker-logs-prod)

Um zu überprüfen, ob unsere Protokolldatei gelöscht wurde, führen Sie den Befehl docker logs -f docker-logs-prod aus und beachten Sie, dass er keine Protokolle aus der Datei zurückgibt.

Löschen Sie Docker-Container-Protokolle mithilfe der Protokollrotation

In den beiden vorherigen Beispielen haben wir die Befehle echo und truncate verwendet, um den Inhalt der Protokolldatei manuell zu löschen. Diese Ansätze werden nicht empfohlen, da sie das Docker-Protokollierungssystem beeinträchtigen und unerwartetes Verhalten verursachen können.

Die empfohlene Methode zum Löschen von Protokollen aus den Containern ist die Verwendung der Protokollrotation. Um die Log-Rotation mit dem Standard-Logging-Treiber json-file zu verwenden, können wir max-size und max-file der Log-Datei in der Datei namens daemon.json einstellen, die sich unter /etc/docker/ Ordner, wie unten gezeigt.

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

Dies sollte mit root-Benutzerrechten erfolgen. Damit die Änderungen wirksam werden, müssen wir Docker mit dem Befehl systemctl reload docker neu laden.

Wenn wir die Protokollrotation für einzelne Container angeben möchten, können wir die Datei --log-driver json-file, --log-opt max-size=10m und --log-opt max-file=3 Optionen beim Ausführen des Containers.

Abschluss

In diesem Tutorial haben wir verschiedene Ansätze kennengelernt, mit denen wir Protokolle aus Docker-Containern löschen können, indem wir den JSON-Inhalt löschen, der den Protokolldateien hinzugefügt wurde. Die Ansätze, die wir in diesem Tutorial behandelt haben, umfassen die Verwendung des Befehls echo, des Befehls truncate und der log-rotation.

David Mbochi Njonge avatar David Mbochi Njonge avatar

David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.

LinkedIn GitHub