J'utilise docker logs [container-name]
pour voir les journaux d'un conteneur spécifique.
Existe-t-il un moyen élégant d'effacer ces journaux?
docker
docker-compose
boot2docker
docker-machine
Youssouf Maiga
la source
la source
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"
Réponses:
À partir de cette question, il y a un one-liner que vous pouvez exécuter:
ou il y a la commande tronquée similaire:
Je ne suis pas un grand fan de l'un d'eux car ils modifient directement les fichiers de Docker. La suppression du journal externe peut se produire pendant que le docker écrit des données au format json dans le fichier, ce qui entraîne une ligne partielle et empêche la lecture des journaux du
docker logs
cli.Au lieu de cela, Docker peut faire pivoter automatiquement les journaux pour vous. Cela se fait avec des indicateurs supplémentaires à dockerd si vous utilisez le pilote de journalisation JSON par défaut :
Vous pouvez également définir cela dans le cadre de votre fichier daemon.json au lieu de modifier vos scripts de démarrage:
Ces options doivent être configurées avec un accès root. 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 la valeur par défaut pour tous les conteneurs nouvellement créés. Remarque: les conteneurs existants doivent être supprimés et recréés pour recevoir les nouvelles limites de journal.Des options de journal similaires peuvent ê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. De
docker run
cela ressemble à:ou dans un fichier de composition:
Pour des économies d'espace supplémentaires, vous pouvez passer du pilote de journal json au pilote de journal "local". Il prend les mêmes options max-size et max-file, mais au lieu de les stocker dans json, il utilise une syntaxe binaire plus rapide et plus petite. Cela vous permet de stocker plus de journaux dans le même fichier. L'entrée daemon.json pour cela ressemble à ceci:
L'inconvénient du pilote local est que les analyseurs / transitaires de journaux externes qui dépendaient d'un accès direct aux journaux json ne fonctionneront plus. Donc, si vous utilisez un outil comme filebeat pour envoyer à Elastic, ou le redirecteur universel de Splunk, j'éviterais le pilote "local".
J'en ai un peu plus à ce sujet dans ma présentation Trucs et astuces .
la source
service docker restart
qui en soi ne fonctionnait pas. Il a également fallu créer de nouveaux conteneurs avant de prendre effet. c'est-à-dire que le simple fait de mettre en place les anciens conteneurs n'a pas appliqué la nouvelle journalisationecho -n > ...
. Quoi qu'il en soit, j'aimerais pouvoir contrôler davantage mes journaux. Par exemple, après le redémarrage de docker-compose , j'aimerais avoir le mécanisme pour faire quelque chose avec les journaux conservés.Utilisation:
Vous pourriez avoir besoin de sudo
réf. Jeff S. Comment effacer correctement les journaux d'un conteneur Docker?
Référence: tronquer un fichier en cours d'utilisation (Linux)
la source
containers
n'est pas disponible autrement.sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
- travaillé pour moierror from daemon in stream: Error grabbing logs: invalid character '\x00' looking for beginning of value
Sur Docker pour Windows et Mac, et probablement d'autres aussi, il est possible d'utiliser l'option tail. Par exemple:
De cette façon, seules les 100 dernières lignes sont affichées, et vous n'avez pas besoin de faire défiler d'abord 1 million de lignes ...
(Et donc, la suppression du journal est probablement inutile)
la source
la source
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"
, pour obtenir uniquement le total de la taille des journauxsudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log | grep total"
Vous pouvez configurer logrotate pour effacer périodiquement les journaux.
Exemple de fichier dans /etc/logrotate.d/docker-logs
la source
docker run
? le fichier/etc/logrotate.d/docker-logs
n'existe pas, je dois le créer?"log-opts"
comme le montre BMitch)Docker4Mac, une solution 2018:
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 laxhyve
machine virtuelle qui sert d' hôte pour tous les conteneurs Docker sous Docker4Mac. La commande que nous exécutons est le familiertruncate -s0 $LOGPATH
des réponses non-Mac.Si vous utilisez
docker-compose
, la première ligne devient:et
<service>
est le nom du service de votredocker-compose.yml
fichier.Merci à https://github.com/justincormack/nsenter1 pour l'
nsenter
astuce.la source
docker run -it --rm --privileged --pid=host alpine:latest nsenter -t 1 -m -u -n -i -- sh -c 'truncate -s0 /var/lib/docker/containers/*/*-json.log'
Vous ne pouvez pas le faire directement via une commande Docker.
Vous pouvez soit limiter la taille du journal, soit utiliser un script pour supprimer les journaux liés à un conteneur. Vous pouvez trouver des exemples de scripts ici (lus à partir du bas): Fonctionnalité: Possibilité d'effacer l'historique des journaux # 1083
Consultez la 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.
la source
En tant qu'utilisateur root , essayez d'exécuter ce qui suit:
ou
ou
la source
Sur mes serveurs Ubuntu même en tant que 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é:
la source
Je préfère celui-ci (parmi les solutions ci-dessus):
Cependant, j'utilise plusieurs systèmes (Ubuntu 18.x Bionic par exemple), où ce chemin ne fonctionne pas comme prévu. Docker est installé via Snap, donc le chemin vers les conteneurs ressemble plus à:
la source
Vous pouvez également fournir les paramètres de journalisation sur la
docker run
ligne de commande, comme ceci:ou dans un docker-compose.yml comme celui-ci
Crédits: https://medium.com/@Quigley_Ja/rotating-docker-logs-keeping-your-overlay-folder-small-40cfa2155412 (James Quigley)
la source
"5"
- dire et"10m"
respectivement), comme illustré ici pour le fichier global daemon.json, mais c'est la même chose pour un docker-compose.yml. Dans les deux cas, cela n'affectera que les conteneurs nouvellement créés."5"
cela fonctionne. Le10m
travail sans citer en effet.Utilisateurs de Docker pour Mac, voici la solution:
Trouvez le chemin du fichier journal par:
$ docker inspect | grep log
SSH dans la machine docker (supposez que le nom est
default
, sinon, exécutezdocker-machine ls
pour le savoir):$ docker-machine ssh default
Changez en utilisateur root ( référence ):
$ sudo -i
Supprimez le contenu du fichier journal:
$ echo "" > log_file_path_from_step1
la source
docker exec -it default sh
pour entrer un shell sh dans un conteneur. Cependant, de nombreux conteneurs ne rendent pas implicitement lasudo
commande disponible.