web-dev-qa-db-fra.com

Comment effacer les journaux correctement pour un conteneur Docker?

J'utilise docker logs [container-name] pour voir les journaux d'un conteneur spécifique.

Y at-il un moyen élégant pour effacer ces journaux?

139
Youssouf Maiga

De cette question il y a un one-liner que vous pouvez exécuter:

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

Je ne suis pas un grand partisan de la modification directe des fichiers de Docker avec cette commande, une commande tronquée ou une rotation du journal, car ils sont tous externes au menu fixe. La suppression du journal externe peut se produire lorsque docker écrit dans le fichier des données au format json, ce qui crée une ligne partielle et empêche de pouvoir lire les journaux du docker logs cli.

Au lieu de cela, vous pouvez faire en sorte que Docker effectue automatiquement la rotation des journaux pour vous. Ceci est fait avec des drapeaux supplémentaires à dockerd si vous utilisez la valeur par défaut pilote de journalisation JSON :

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

Vous pouvez également définir cela dans le cadre de votre fichier daemon.json au lieu de modifier vos scripts de démarrage:

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

Assurez-vous d’exécuter un systemctl reload docker après avoir modifié ce fichier pour appliquer les paramètres. Ce paramètre sera alors le paramètre par défaut pour tous les conteneurs nouvellement créés. Les conteneurs existants doivent être supprimés et recréés pour recevoir les nouvelles limites de journal. Des options de journal similaires peuvent également être transmises à des conteneurs individuels pour remplacer ces valeurs par défaut, ce qui vous permet d’enregistrer plus ou moins de journaux sur des conteneurs individuels.

172
BMitch

Utilisation:

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

Référence: Tronquer un fichier pendant son utilisation (Linux)

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

Vous pouvez configurer logrotate pour effacer les journaux périodiquement.

Exemple de fichier dans /etc/logrotate.d/docker-logs

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

Vous ne pouvez pas le faire directement via une commande Docker.

Vous pouvez limiter la taille du journal ou utiliser un script pour supprimer les journaux liés à un conteneur. Vous trouverez des exemples de scripts ici (à lire en bas): Fonctionnalité: possibilité d'effacer l'historique des journaux # 108

Consultez le section de journalisation de la référence de fichier docker-compose, où vous pouvez spécifier des options (telles que la rotation du journal et la limite de taille du journal) pour certains pilotes de journalisation.

9
Tristan

Sur Docker sous Windows et probablement d’autres aussi, il est possible d’utiliser l’option tail.

par exemple. journal de menu fixe -f --tail 100 msftmodbus

De cette façon, seules les 100 dernières lignes sont affichées, et vous n'avez pas d'abord à faire défiler les 1M lignes…

(Et donc, la suppression du journal est probablement inutile)

8
Egbert Nierop

Docker4Mac, une solution 2018:

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

La première ligne obtient le chemin du fichier journal, similaire à la réponse acceptée.

La deuxième ligne utilise nsenter qui vous permet d’exécuter des commandes dans le xhyve VM serveurs servant d’hôte pour tous les conteneurs de menu fixe sous Docker4Mac. La commande que nous exécutons est le familier truncate -s0 $LOGPATH de réponses non-Mac.

Si vous utilisez docker-compose, la première ligne devient:

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

et <service> est le nom du service de votre fichier docker-compose.yml.

Merci à https://github.com/justincormack/nsenter1 pour l'astuce nsenter.

8
elifiner

En tant qu'utilisateur root, essayez de lancer ce qui suit:

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

ou

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

ou

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

Sur mes serveurs Ubuntu, même sous Sudo, j'obtiendrais Cannot open ‘/var/lib/docker/containers/*/*-json.log’ for writing: No such file or directory

Mais peigner le docker inspecter et tronquer les réponses a fonctionné:

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

Docker pour les utilisateurs de Mac, voici la solution:

    1. Trouver le chemin du fichier journal par:

      $ docker inspect | grep log

    1. SSH dans l'ordinateur fixe (supposez que le nom soit default, sinon exécutez docker-machine ls pour le savoir):

      $ docker-machine ssh default

    1. Changer en utilisateur root ( référence ):

      $ Sudo -i

    1. Supprimer le contenu du fichier journal:

      $ echo "" > log_file_path_from_step1

0
Jinsong Li