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?
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?
Réponses:
À partir de cette question, il y a un one-liner que vous pouvez exécuter:
echo "" > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
ou il y a la commande tronquée similaire:
truncate -s 0 $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
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 :
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"}
}
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 à:
docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 ...
ou dans un fichier de composition:
version: '3.7'
services:
app:
image: ...
logging:
options:
max-size: "10m"
max-file: "3"
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:
{
"log-driver": "local",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
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 .
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 journalisation
echo -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:
truncate -s 0 /var/lib/docker/containers/*/*-json.log
Vous pourriez avoir besoin de sudo
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
réf. Jeff S. Comment effacer correctement les journaux d'un conteneur Docker?
Référence: tronquer un fichier en cours d'utilisation (Linux)
containers
n'est pas disponible autrement.
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
- travaillé pour moi
error 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:
docker logs -f --tail 100
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)
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
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
/var/lib/docker/containers/*/*.log {
rotate 7
daily
compress
size=50M
missingok
delaycompress
copytruncate
}
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:
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 la xhyve
machine virtuelle qui sert d' hôte pour tous les conteneurs Docker sous Docker4Mac. La commande que nous exécutons est le familier truncate -s0 $LOGPATH
des 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 docker-compose.yml
fichier.
Merci à https://github.com/justincormack/nsenter1 pour l' nsenter
astuce.
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.
En tant qu'utilisateur root , essayez d'exécuter 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
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é:
sudo truncate -s 0 `docker inspect --format='{{.LogPath}}' <container>`
Je préfère celui-ci (parmi les solutions ci-dessus):
truncate -s 0 /var/lib/docker/containers/*/*-json.log
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 à:
truncate -s 0 /var/snap/docker/common/var-lib-docker/containers/*/*-json.log
Vous pouvez également fournir les paramètres de journalisation sur la docker run
ligne de commande, comme ceci:
docker run --log-opt max-size=10m --log-opt max-file=5 my-app:latest
ou dans un docker-compose.yml comme celui-ci
my-app:
image: my-app:latest
logging:
driver: "json-file"
options:
max-file: "5"
max-size: 10m
Crédits: https://medium.com/@Quigley_Ja/rotating-docker-logs-keeping-your-overlay-folder-small-40cfa2155412 (James Quigley)
"5"
cela fonctionne. Le 10m
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écutez docker-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
docker exec -it default sh
pour entrer un shell sh dans un conteneur. Cependant, de nombreux conteneurs ne rendent pas implicitement la sudo
commande disponible.
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"