Io uso docker logs [container-name]
per vedere i registri di un contenitore specifico.
Esiste un modo elegante per cancellare questi registri?
Io uso docker logs [container-name]
per vedere i registri di un contenitore specifico.
Esiste un modo elegante per cancellare questi registri?
Risposte:
Da questa domanda c'è un one-liner che puoi eseguire:
echo "" > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
o c'è il comando troncato simile:
truncate -s 0 $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
Non sono un grande fan di nessuno dei due poiché modificano direttamente i file di Docker. L'eliminazione del registro esterno potrebbe verificarsi mentre la finestra mobile sta scrivendo i dati in formato json nel file, risultando in una riga parziale e interrompendo la capacità di leggere qualsiasi registro dal docker logs
cli.
Invece, puoi fare in modo che Docker ruoti automaticamente i log per te. Questo viene fatto con flag aggiuntivi per dockerd se si utilizza il driver di registrazione JSON predefinito :
dockerd ... --log-opt max-size=10m --log-opt max-file=3
Puoi anche impostarlo come parte del tuo file daemon.json invece di modificare i tuoi script di avvio:
{
"log-driver": "json-file",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
Queste opzioni devono essere configurate con accesso root. Assicurati di eseguire un systemctl reload docker
dopo aver modificato questo file per applicare le impostazioni. Questa impostazione sarà quindi quella predefinita per tutti i contenitori appena creati. Nota: i contenitori esistenti devono essere eliminati e ricreati per ricevere i nuovi limiti di registro.
Opzioni di registro simili possono essere passate ai singoli contenitori per sovrascrivere queste impostazioni predefinite, consentendo di salvare più o meno registri sui singoli contenitori. Da docker run
questo sembra:
docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 ...
o in un file di composizione:
version: '3.7'
services:
app:
image: ...
logging:
options:
max-size: "10m"
max-file: "3"
Per risparmiare spazio, è possibile passare dal driver di registro json al driver di registro "locale". Prende le stesse opzioni di dimensione massima e file massimo, ma invece di archiviare in json utilizza una sintassi binaria che è più veloce e più piccola. Ciò consente di archiviare più registri nello stesso file di dimensioni. La voce daemon.json per questo assomiglia a:
{
"log-driver": "local",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
L'aspetto negativo del driver locale è che i parser / forwarder di log esterni che dipendevano dall'accesso diretto ai log json non funzioneranno più. Quindi, se usi uno strumento come filebeat per inviare a Elastic, o lo spedizioniere universale di Splunk, eviterei il driver "locale".
Ho un po 'di più su questo nella mia presentazione Suggerimenti e trucchi .
service docker restart
che da solo non ha funzionato. Inoltre ha dovuto creare nuovi contenitori prima di entrare in vigore. vale a dire che solo il
echo -n > ...
. Ad ogni modo, vorrei poter avere un maggiore controllo sui miei registri. Ad esempio, dopo il riavvio della finestra mobile , mi piacerebbe avere il meccanismo per fare qualcosa con i registri conservati.
Uso:
truncate -s 0 /var/lib/docker/containers/*/*-json.log
Potrebbe essere necessario sudo
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
rif. Jeff S. Come cancellare correttamente i log per un container Docker?
Riferimento: troncare un file mentre viene utilizzato (Linux)
containers
altrimenti il contenuto di non è disponibile.
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
- ha funzionato per me
error from daemon in stream: Error grabbing logs: invalid character '\x00' looking for beginning of value
Su Docker per Windows e Mac, e probabilmente anche su altri, è possibile utilizzare l'opzione tail. Per esempio:
docker logs -f --tail 100
In questo modo, vengono visualizzate solo le ultime 100 linee e non è necessario prima scorrere tra le linee 1M ...
(E quindi, probabilmente non è necessario eliminare il registro)
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"
, per ottenere solo il totale della dimensione dei registrisudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log | grep total"
È possibile impostare logrotate per cancellare periodicamente i registri.
File di esempio in /etc/logrotate.d/docker-logs
/var/lib/docker/containers/*/*.log {
rotate 7
daily
compress
size=50M
missingok
delaycompress
copytruncate
}
docker run
? il file /etc/logrotate.d/docker-logs
non esiste, devo crearlo?
"log-opts"
come mostrato da BMitch)
Docker4Mac, una soluzione 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 prima riga ottiene il percorso del file di registro, simile alla risposta accettata.
La seconda riga utilizza nsenter
che consente di eseguire comandi nella xhyve
VM che server come host per tutti i contenitori docker in Docker4Mac. Il comando che eseguiamo è il familiare truncate -s0 $LOGPATH
dalle risposte non Mac.
Se stai usando docker-compose
, la prima riga diventa:
local LOGPATH=$(docker inspect --format='{{.LogPath}}' $(docker-compose ps -q <service>))
ed <service>
è il nome del servizio dal tuo docker-compose.yml
file.
Grazie a https://github.com/justincormack/nsenter1 per il nsenter
trucco.
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'
Non puoi farlo direttamente tramite un comando Docker.
È possibile limitare le dimensioni del registro o utilizzare uno script per eliminare i registri relativi a un contenitore. Qui puoi trovare esempi di script (leggi dal basso): Funzione: possibilità di cancellare la cronologia dei registri # 1083
Controlla la sezione di registrazione del riferimento al file comporre docker, in cui è possibile specificare le opzioni (come la rotazione del registro e il limite della dimensione del registro) per alcuni driver di registrazione.
Come utente root , prova a eseguire quanto segue:
> /var/lib/docker/containers/*/*-json.log
o
cat /dev/null > /var/lib/docker/containers/*/*-json.log
o
echo "" > /var/lib/docker/containers/*/*-json.log
Sui miei server Ubuntu anche se sudo avrei ottenuto Cannot open ‘/var/lib/docker/containers/*/*-json.log’ for writing: No such file or directory
Ma pettinando la finestra mobile ispezionare e troncare le risposte ha funzionato:
sudo truncate -s 0 `docker inspect --format='{{.LogPath}}' <container>`
Preferisco questo (dalle soluzioni sopra):
truncate -s 0 /var/lib/docker/containers/*/*-json.log
Tuttavia sto eseguendo diversi sistemi (Ubuntu 18.x Bionic per esempio), in cui questo percorso non funziona come previsto. Docker viene installato tramite Snap, quindi il percorso dei contenitori è più simile a:
truncate -s 0 /var/snap/docker/common/var-lib-docker/containers/*/*-json.log
Puoi anche fornire i parametri di log-opts dalla docker run
riga di comando, in questo modo:
docker run --log-opt max-size=10m --log-opt max-file=5 my-app:latest
o in un docker-compose.yml come questo
my-app:
image: my-app:latest
logging:
driver: "json-file"
options:
max-file: "5"
max-size: 10m
Crediti: https://medium.com/@Quigley_Ja/rotating-docker-logs-keeping-your-overlay-folder-small-40cfa2155412 (James Quigley)
"5"
funziona. Il 10m
lavoro senza citare davvero.
Docker per utenti Mac, ecco la soluzione:
Trova il percorso del file di registro per:
$ docker inspect | grep log
SSH nella macchina docker (supponiamo che il nome sia default
, in caso contrario, eseguito docker-machine ls
per scoprirlo):
$ docker-machine ssh default
Passa a utente root ( riferimento ):
$ sudo -i
Elimina il contenuto del file di registro:
$ echo "" > log_file_path_from_step1
docker exec -it default sh
per inserire una shell sh in un contenitore. Tuttavia, molti contenitori non rendono implicitamente sudo
disponibile il comando.
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"