TGTGInsightаналитика telegramLIVE / telegram public index
← DevOps
DevOps avatar

TGINSIGHT POST

Post #1466

@DevOPSitsec

DevOps

Просмотры4,570Количество просмотров
Опубликован27 апр.27.04.2025, 11:05
Содержимое поста

Содержимое

🚨 Задача: «Исчезающий файл 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 🎲Ответ : Файл исчезает, потому что каждую ночь в 3:00 NFS-сервер создает snapshot папки /opt/app/logs, который включает операцию очистки или пересоздания директории. В результате на хосте директория монтирования получает новый inode, и предыдущий файл перестаёт быть доступен через старый inode, хотя внутри контейнера файл с прежним inode остаётся открыт приложением и продолжает записываться, пока не закрыт. То есть файл есть (открыт процессом приложения в контейнере), но на хосте его inode больше не соответствует новому inode директории, и файл становится «невидимым». ✅ Решение проблемы: Приложению необходимо после каждой операции snapshot заново открывать файлы логов, либо перезапускать контейнер после snapshot. Либо использовать локальное монтирование (local volume) вместо NFS с snapshot, либо настроить snapshot так, чтобы он не менял inode директории. @DevopsDocker