Как очистить журналы контейнеров Docker?

Я прочитал вывод журнала контейнера Docker, используя

docker logs -f <container_name>

Я записываю много данных в журнал моего приложения node.js через вызовы console.log(). Мне нужно очистить журнал, потому что он слишком длинный, и команда docker logs сначала проходит через существующие строки журнала до того, как доходит до конца. Как очистить его, чтобы сделать его коротким снова? Я бы хотел увидеть команду вроде:

docker logs clean <container_name>

Но это, похоже, не существует.

Ответ 1

Во-первых, если вам просто нужно увидеть меньше выходных данных, вы можете сделать так, чтобы докер показывал вам только самые последние строки:

docker logs --since 30s -f <container_name_or_id>

Или вы можете ограничить количество строк:

docker logs --tail 20 -f <container_name_or_id>

Чтобы удалить журналы при установке Docker для Linux, вы можете запустить следующее для одного контейнера:

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

Обратите внимание, что для этого требуется root, и я не рекомендую этого. Вы могли бы потенциально испортить файл журнала, если обнулили файл в середине докера, записывая журнал в тот же файл. Вместо этого вы должны настроить докер для вращения журналов.


Наконец, вы можете настроить докер для автоматического поворота журналов с помощью следующего в файле /etc/docker/daemon.json:

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

Это позволяет Docker хранить до 3 файлов журналов в одном контейнере, причем каждый файл ограничен 10 мегабайтами (таким образом, ограничение от 20 до 30 мегабайт журналов в одном контейнере). Чтобы применить эти изменения, вам нужно запустить systemctl reload docker. И эти изменения являются значениями по умолчанию для любого вновь созданного контейнера, они не применяются к уже созданным контейнерам. Вам нужно будет удалить и воссоздать все существующие контейнеры, чтобы применить эти настройки.

Ответ 2

Это не идеальное решение, но пока Docker не создаст команду для этого, это хороший обходной путь.

Создайте файл сценария docker-clean-logs.sh со следующим содержимым:

#!/bin/bash

rm $(docker inspect $1 | grep -G '"LogPath": "*"' | sed -e 's/.*"LogPath": "//g' | sed -e 's/",//g');

Предоставьте ему разрешение на выполнение:

chmod +x ./docker-clean-logs.sh

Остановите контейнер Docker, который вы хотите очистить:

docker stop <container_name>

Затем запустите приведенный выше скрипт:

./docker-clean-logs.sh <container_name>

И, наконец, снова запустите свой контейнер:

docker start ...

Кредит переходит к пользователю sgarbesi на этой странице: https://github.com/docker/compose/issues/1083

Ответ 4

Чтобы сделать это на OSX, вам нужно добраться до виртуальной машины, в которой запущены контейнеры Docker.

Вы можете использовать изображение walkerlee/nsenter для запуска команд внутри виртуальной машины следующим образом:

docker run --rm -it --privileged --pid=host walkerlee/nsenter -t 1 -m -u -i -n sh

Объединив это с упрощенной версией принятого ответа, вы получите:

#!/bin/sh
docker run --rm -it --privileged --pid=host walkerlee/nsenter -t 1 -m -u -i -n \
    cp /dev/null $(docker inspect -f '{{.LogPath}}' $1)

Сохраните его, chmod +x, запустите его.

Насколько я могу судить, это не требует остановки контейнера. Кроме того, он очищает файл журнала (а не удаляет его), избегая ошибок при выполнении docker logs после очистки.

Ответ 5

Решение для службы Docker Swarm:

   logging:
     options:
       max-size: "10m"
       max-file: "10"

Ответ 6

Если вы хотите удалить все файлы журнала, а не только для конкретного журнала контейнера, вы можете использовать:

docker system prune