В комментариях задали вопрос: как настроить ротацию логов приложения в Docker, в частности вопрос касался веб-сервера Angie.
При этом следует понимать, что речь идет не о логах самого Docker, а именно о логах приложения, работающего в контейнере. И несмотря на то, что в данной заметке речь идет об Angie/NGINX данный подход применим к любым приложениям пишущим собственные логи.
Если мы посмотрим в типовую конфигурацию виртуального хоста Angie/NGINX, то увидим там примерно следующее:
access_log /var/log/angie/my_site.access.log;
error_log /var/log/angie/my_site.error.log;
Если ничего больше не делать, то логи будут неконтролируемо расти внутри контейнера, но при его перезапуске окажутся утеряны. И то и другое является нежелательным, поэтому будем исправлять ситуацию.
Прежде всего вынесем логи на хост, поэтому смонтируем дополнительный Volume, для этого в compose-файл добавьте:
volumes:
- /opt/my_site /logs:/var/log/angie
Теперь, после перезапуска все логи будут в
/opt/my_site /logs и при перезапуске контейнера не будут потеряны. Для их ротации воспользуемся системной службой logrotate, для этого в
/etc/logrotate.d/ создадим дополнительный файл настроек для нашей службы, например angie-mysite и внесем в него следующий текст:/opt/my_site/logs/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0644 root root
sharedscripts
postrotate
docker exec angie-mysite angie -s reopen
endscript
}Где angie-mysite в команде docker exec – имя контейнера, убедитесь, что в вашем compose-файле есть опция:
container_name: angie-mysite
А в остальном это стандартная конфигурация logrotate, мы делаем ротацию каждый день, храним 14 архивов, все архивы, кроме предпоследнего сжимаем.
После выполнения ротации мы дополнительно посылаем серверу Angie команду reopen на переоткрытие файлов лога.
Проверить работу конфигурации можно командой:
logrotate -d /etc/logrotate.d/angie-mysite
Которая ничего не делает, но только имитирует команду ротации, таким образом вы проверите конфигурационный файл на предмет ошибок и убедитесь, что все указано верно.
