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?
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.
Utilisation:
truncate -s 0 /var/lib/docker/containers/*/*-json.log
Référence: Tronquer un fichier pendant son utilisation (Linux)
Sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
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
}
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.
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)
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
.
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
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>`
Docker pour les utilisateurs de Mac, voici la solution:
Trouver le chemin du fichier journal par:
$ docker inspect | grep log
SSH dans l'ordinateur fixe (supposez que le nom soit default
, sinon exécutez docker-machine ls
pour le savoir):
$ docker-machine ssh default
Changer en utilisateur root ( référence ):
$ Sudo -i
Supprimer le contenu du fichier journal:
$ echo "" > log_file_path_from_step1