Como limpar registros de contêineres do Docker em execução

0
32


Os contêineres do Docker de longa duração podem acumular rapidamente um grande número de linhas de log. Eles consomem a capacidade de armazenamento e reduzem o desempenho acessando e filtrando dados. Embora o Docker inclua ferramentas internas para exibir logs, não há mecanismo interno para limpá-los.

DML Y DDL comando basicos
DML Y DDL comando basicos

Neste artigo, você aprenderá como limpar os logs de contêineres do Docker em execução, sem reiniciá-los ou substituí-los. Você também verá algumas técnicas para lidar com registros grandes com mais eficiência, mantendo os dados antigos.

entenda o problema

O Docker coleta logs da saída padrão e fluxos de erros dos processos em primeiro plano do contêiner. a docker logs O comando é usado para recuperar esses registros, mas não permite remover linhas antigas.

O Docker oferece suporte a muitos drivers de registro diferentes, portanto, não é possível fornecer um mecanismo de limpeza padronizado. Este artigo se concentra no padrão json-file log handler, onde as linhas de log são armazenadas em um arquivo JSON no sistema de arquivos do host do seu contêiner. Consulte a documentação do controlador de armazenamento se precisar limpar os logs transmitidos para um host remoto.

Arquivos de log criados pelo json-file controlador são armazenados sob o /var/lib/docker/containers diretório. Cada contêiner obtém seu próprio arquivo de log que é usado ao longo de sua vida útil. Não há rotação de log configurada por padrão.

Simplesmente excluir o arquivo de log não é uma solução eficaz. O Docker espera que o arquivo esteja continuamente disponível e não o recriará automaticamente se for excluído. É mais seguro Claro o conteúdo do registrador existente para evitar afetar as gravações atuais.

Descubra o caminho do arquivo de log

Primeiro, encontre o caminho para o arquivo de log do seu contêiner de destino. Você pode recuperar o caminho do arquivo de log para um contêiner chamado my-app executando o seguinte comando:

$ docker inspect --format="{{.LogPath}}" my-app
/var/lib/containers/1380d936...-json.log

Limpar arquivo de registro

Você pode limpar o conteúdo do log sem excluí-lo fazendo eco de uma string vazia em seu conteúdo. O arquivo será de propriedade de root então você precisará executar esta operação em um shell raiz. O comando a seguir liberará o arquivo de log para você:

$ sudo sh -c 'echo "" > $(docker inspect --format="{{.LogPath}}" my-app)'

A interpolação do shell é usada para recuperar dinamicamente o caminho do arquivo de log para o my-app recipiente. Em vez disso, você pode substituir manualmente no caminho recuperado anteriormente.

quando você corre docker logs my-appagora você verá uma saída vazia, a menos que o contêiner tenha retomado a escrita de linhas nesse meio tempo.

Limitação de saída de log

a docker logs O comando aceita alguns argumentos que podem ser usados ​​para limitar a saída de logs ruidosos. Isso ajuda a mitigar a necessidade de limpar o registro e evitar que seu terminal seja inundado com linhas antigas toda vez que você acessar o arquivo.

  • --tail – Este sinalizador diz ao Docker para emitir apenas um número específico de linhas de log antigas, começando com a mais recente.
  • --until S --since – Esses sinalizadores restringem a saída às linhas de log emitidas durante um período de tempo específico. Eles são úteis quando você conhece o período de tempo aproximado em que um evento ocorreu.

aqui estão alguns exemplos:

Mostrar as 100 linhas de log mais recentes

docker logs my-app --tail 100

Mostrar linhas de log escritas na última hora

docker logs my-app --since 1h

Mostra até 100 linhas de log escritas na última hora

docker logs my-app --tail 100 --since 1h

Configurações de rotação de log

Ter que limpar regularmente os arquivos de log dessa maneira geralmente indica que os logs de seu aplicativo são excessivamente detalhados ou simplesmente há muita atividade para armazenar em um arquivo.

Muitos drivers de registro do Docker, incluindo json-filetem suporte opcional de rotação de log que você pode habilitar globalmente para o daemon do Docker ou por contêiner.

As configurações do daemon são definidas em /etc/docker/daemon.json. Este é um exemplo que alterna os logs do contêiner quando atingem 8 MB. Até cinco arquivos serão mantidos ao mesmo tempo, com arquivos antigos automaticamente excluídos à medida que novas rotações ocorrerem.

{
    "log-opts": {
        "max-size": "8m",
        "max-file": "5"
    }
}

Reinicie o daemon do Docker para aplicar a alteração:

$ sudo service docker restart

A rotação no nível do daemon se aplica a todos os contêineres recém-criados. As alterações não afetarão nenhum contêiner que já exista em seu host.

A rotação pode ser definida para recipientes individuais usando --log-opts sinalizadores Eles substituirão as configurações padrão do daemon do Docker.

docker run --name app 
    --log-driver json-file 
    --log-opts max-size=8M 
    --log-opts max-file=5 
    app-image:latest

Resumo

Os logs de contêiner do Docker podem ficar ruidosos quando aplicativos ocupados gravam uma saída grande. O acesso a logs detalhados é útil para depuração, mas eles consomem espaço de armazenamento, dificultam a seleção de dados e podem diminuir o desempenho.

Você pode limpar arquivos de log sob demanda usando comandos shell para esvaziar seu conteúdo. No entanto, é uma prática recomendada configurar a rotação de log para ocorrer automaticamente quando os arquivos atingirem um tamanho especificado. a docker logs O comando também oferece suporte a sinalizadores que podem ajudar a controlar logs complicados no ponto de acesso.