Подтвердить что ты не робот

Как правильно очистить логи для контейнера Docker?

Я использую docker logs [container-name] чтобы увидеть логи конкретного контейнера.

Есть ли элегантный способ очистить эти журналы?

4b9b3361

Ответ 1

Из этого вопроса есть одна строка, которую вы можете запустить:

echo "" > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)

Я не большой поклонник изменения файлов Docker напрямую с помощью этой команды, команды усечения или ротации журнала, поскольку каждый из них является внешним по отношению к Docker. Удаление внешнего журнала может произойти, когда докер записывает данные в формате json в файл, что приводит к появлению частичной строки и нарушению возможности чтения любых журналов из docker logs cli.

Вместо этого вы можете сделать так, чтобы Docker автоматически поворачивал журналы для вас. Это делается с помощью дополнительных флагов для dockerd, если вы используете драйвер ведения журнала JSON по умолчанию:

dockerd ... --log-opt max-size=10m --log-opt max-file=3

Вы также можете установить это как часть своего файла daemon.json вместо изменения сценариев запуска:

{
  "log-driver": "json-file",
  "log-opts": {"max-size": "10m", "max-file": "3"}
}

Обязательно запустите systemctl reload docker после изменения этого файла, чтобы применить настройки. Этот параметр будет по умолчанию для всех вновь создаваемых контейнеров. Существующие контейнеры необходимо удалить и создать заново, чтобы получить новые ограничения журнала. И аналогичные параметры журнала могут быть переданы в отдельные контейнеры, чтобы переопределить эти значения по умолчанию, что позволяет вам сохранить больше или меньше журналов в отдельных контейнерах.

Ответ 3

sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"

Ответ 4

Вы можете настроить logrotate для периодического удаления журналов.

Файл примера в файле /etc/logrotate.d/docker-logs

/var/lib/docker/containers/*/*.log {
 rotate 7
 daily
 compress
 size=50M
 missingok
 delaycompress
 copytruncate
}

Ответ 5

В Docker для Windows и Mac, а также, возможно, и других, можно использовать опцию tail. Например:

docker logs -f --tail 100

Таким образом, отображаются только последние 100 строк, и вам не нужно сначала пролистывать 1М строк...

(И, следовательно, удаление журнала, вероятно, не требуется)

Ответ 6

Вы не можете сделать это напрямую через команду Docker.

Вы можете либо ограничить размер журнала, либо использовать скрипт для удаления журналов, связанных с контейнером. Вы можете найти примеры сценариев здесь (читайте снизу) : Возможность: Очистить историю журнала # 1083

Ознакомьтесь с разделом ведения журнала в справочнике по файлам docker-compose, где вы можете указать параметры (например, поворот журнала и ограничение размера журнала) для некоторых драйверов ведения журнала.

Ответ 7

Docker4Mac, решение 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

Первая строка получает путь к файлу журнала, аналогично принятому ответу.

Во второй строке используется nsenter который позволяет вам запускать команды на xhyve которая является хостом для всех док-контейнеров под Docker4Mac. Команда, которую мы запускаем, является знакомым truncate -s0 $LOGPATH из ответов, не относящихся к Mac.

Если вы используете docker-compose, первая строка становится такой:

local LOGPATH=$(docker inspect --format='{{.LogPath}}' $(docker-compose ps -q <service>))

<service> - это имя службы из вашего файла docker-compose.yml.

Спасибо https://github.com/justincormack/nsenter1 за трюк с nsenter.

Ответ 8

Как пользователь root, попробуйте выполнить следующее:

>  /var/lib/docker/containers/*/*-json.log

или же

cat /dev/null > /var/lib/docker/containers/*/*-json.log

или же

echo "" > /var/lib/docker/containers/*/*-json.log

Ответ 9

На моих серверах Ubuntu, даже если у меня есть sudo, я не Cannot open '/var/lib/docker/containers/*/*-json.log for writing: No such file or directory

Но расчесывание докера проверяет и усекает ответы:

sudo truncate -s 0 'docker inspect --format='{{.LogPath}}' <container>'

Ответ 10

Доккер для пользователей Mac, вот решение:

    • Найдите путь к файлу журнала:

      $ docker inspect | grep log

    1. SSH в докер-машину (предположим, что имя default, если нет, запустите docker-machine ls, чтобы узнать):

      $ docker-machine ssh default

  1. Измените пользователя root (ссылка):

    $ sudo -i

  1. Удалить содержимое файла журнала:

    $ echo "" > log_file_path_from_step1

Ответ 11

Я предпочитаю это (из решений выше):

truncate -s 0 /var/lib/docker/containers/*/*-json.log

Однако я использую несколько систем (например, Ubuntu 18.x Bionic), где этот путь не работает должным образом. Docker устанавливается через Snap, поэтому путь к контейнерам больше похож на:

truncate -s 0 /var/snap/docker/common/var-lib-docker/containers/*/*-json.log