tg-me.com/DevOPSitsec/1466
Last Update:
🚨 Задача: «Исчезающий файл Docker-контейнера»
У вас есть Docker-контейнер, который запускается с помощью следующей команды:
docker run -d --name tricky_container -v /opt/app/logs:/app/logs my-app-image
Приложение внутри контейнера ежедневно генерирует важный лог-файл:
/app/logs/important.log
В течение дня файл корректно пишется и виден в директории на хосте:
/opt/app/logs/important.log
Но ежедневно ровно в 3:00 ночи файл внезапно исчезает из папки на хосте, хотя приложение продолжает работать без ошибок и даже продолжает писать логи. После перезапуска контейнера утром, файл снова появляется и снова становится видимым на хосте.
🎯 Задача для специалиста:
Выяснить причину исчезновения файла ровно в 3:00 ночи.
Объяснить, почему приложение продолжает успешно писать лог, хотя на хосте он не виден.
Предложить решение, которое предотвращает исчезновение файла.
🔍 Подсказки и ограничения (подвохи):
На хосте нет видимых cron-задач и systemd-таймеров, удаляющих файл.
Контейнер запускается без рестартов и остается активным круглосуточно.
Внутри контейнера тоже нет cron-задач.
Docker-контейнеры не пересоздаются автоматически.
Подсказка: хостовая папка /opt/app/logs монтируется на сетевой диск (NFS), и у неё есть внешнее резервное копирование с моментальными снимками (snapshots), которые делаются каждую ночь в 3:00.
🔧 Команды и подходы для расследования:
Шаг 1: Проверить состояние контейнера
docker ps
docker inspect tricky_container
docker logs tricky_container
Шаг 2: Проверить, есть ли файл внутри контейнера
docker exec -it tricky_container ls -l /app/logs/
docker exec -it tricky_container tail /app/logs/important.log
Шаг 3: Проверить монтирование томов и слои файловой системы
docker inspect tricky_container --format '{{json .Mounts}}' | jq
Шаг 4: Исследовать NFS-папку и поведение в момент создания snapshot
df -hT /opt/app/logs
mount | grep nfs
Шаг 5: Проверить inode-файл внутри контейнера и на хосте
docker exec tricky_container ls -li /app/logs/important.log
ls -li /opt/app/logs/important.log
🎲 Ответ :
В результате на хосте директория монтирования получает новый inode, и предыдущий файл перестаёт быть доступен через старый inode, хотя внутри контейнера файл с прежним inode остаётся открыт приложением и продолжает записываться, пока не закрыт.
То есть файл есть (открыт процессом приложения в контейнере), но на хосте его inode больше не соответствует новому inode директории, и файл становится «невидимым».
✅ Решение проблемы:
Приложению необходимо после каждой операции snapshot заново открывать файлы логов, либо перезапускать контейнер после snapshot.
Либо использовать локальное монтирование (local volume) вместо NFS с snapshot, либо настроить snapshot так, чтобы он не менял inode директории.
@DevopsDocker
BY DevOps
Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283
Share with your friend now:
tg-me.com/DevOPSitsec/1466