Как очистить журналы контейнеров 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
Ответ 3
Вы можете использовать logrotate, как описано в этой статье
https://sandro-keil.de/blog/2015/03/11/logrotate-for-docker-container/
Это необходимо сделать до запуска контейнера.
Ответ 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