Docker блокирует примонтированный том?

Есть следующая ситуация:
- Сервис spring-boot пишет логи через logback в файл output.log
- В logback настроена ротация логов и он периодически опустошает output.log, откидывая логи в архивные файлы, указанные в политике ротации. То есть сам output.log является таким временным буфером с самым свежим логом
- Все это замечательно работает: https://www.youtube.com/watch?v=hrWmfC3y9zM
- Но если мы монтируем папку с логами из контейнера наружу (а нам надо это для чтения сторонней утилитой), то все ломается - output.log перестает автоматически очищаться, неограниченно растет, а архивные файлы, указанные в политике ротации не создаются вовсе. Это происходит даже когда файл из этой директории на хостовой машине никто не читает.

Условно вот так
1) Это внутри контейнера с сервисом
/app/
    |-> service.jar


буферный лог пишется сюда:
/app/logs/
         |-> output.log


файлы ротации откидываются сюда
/app/
     |-> out1.log
     |-> out2.log


монтируется наружу так:
volumes:
  - /LOGS:/app/logs:rw

2. Второй контейнер, читающий логи смонтирован так:
volumes:
  - /LOGS:/var/log

Но читающий контейнер ни при чем. Даже когда он остановлен, файл блокируется. То есть для блокировки достаточно просто примонтировать папку в первом контейнере-источнике с сервисом

Это какая-то особенность томов докера? И можно это как-то обойти?
  • Вопрос задан
  • 143 просмотра
Пригласить эксперта
Ответы на вопрос 1
chupasaurus
@chupasaurus
Сею рефлекторное, злое, временное
Задав в качестве тома файл, ядро будет держать файловый дескриптор на него пока жив контейнер (отпускать будет только после ребута сервера, пока не запущен демон Docker). Монтируйте директории с логами, если хотите нормальной ротации.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы