#Как выглядит неисправность
После docker compose up --force-recreate или обновления образа исчезают файлы, созданные прямо внутри контейнера. Файловая система контейнера не предназначена для постоянного хранения рабочих данных: их следует размещать в именованном томе или привязанном каталоге хоста.
#Причины и признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Данные записываются только в слой контейнераПуть не связан с volume или bind mount | docker inspect не показывает Mounts для папки данных | Вынести состояние в постоянный том |
| Смонтирован не тот каталогМонтирование закрывает данные внутри образа | После создания контейнера видны пустые файлы в точке назначения | Проверить source и destination в Mounts |
#Пошаговое устранение
- 1. Остановите повторные пересозданияЕсли данные уже пропали, прекратите deploy, который удаляет и создаёт контейнеры. Через docker ps -a найдите прежний остановленный контейнер: если он не удалён, его слой ещё может содержать файлы.Linux · Терминал (Bash)КомандаЧтение списка контейнеров.
docker ps -a
- 2. Посмотрите, где подключено хранилищеПроверьте docker inspect --format ... ИМЯ. В Mounts будут Type=volume или Type=bind, Source на хосте и Destination внутри. Если нужной директории нет в списке, файлы писались в слой контейнера.Linux · Терминал (Bash)КомандаТолько чтение монтирований; не показывает содержимое файлов.
docker inspect --format '{{json .Mounts}}' ИМЯ
- 3. Проверьте запись в конфигурации ComposeОткройте compose.yaml и найдите services → имя → volumes. Убедитесь, что путь внутри контейнера совпадает с фактическим путём данных приложения; например, для службы с /app/uploads нужен том именно там, а не только /app/cache.
- 4. Снимите резервную копию живых данныхЕсли старый контейнер ещё существует, выполните docker cp ИМЯ:/app/uploads ./uploads-backup в отдельной директории на хосте с достаточным местом. Подставьте свой путь и проверьте содержимое копии до следующего шага. Для активно меняющейся БД требуется согласованный снимок/экспорт, не обычное копирование файлов.Linux · Терминал (Bash)С осторожностьюКопирует выбранные файлы из контейнера на хост; проверяйте путь и свободное место.
docker cp ИМЯ:/app/uploads ./uploads-backupКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- 5. Настройте постоянное хранилище в тестовой копииВ compose.yaml добавьте именованный том для каталога данных и определение volumes на верхнем уровне. Сначала проверьте docker compose config --quiet. При первом монтировании пустой том или bind mount может скрыть содержимое образа; переносите файлы только после проверки.Linux · Терминал (Bash)КомандаПроверка синтаксиса, без изменений контейнера.
docker compose config --quiet
- 6. Проверьте сохранение после тестового пересозданияВ отдельном тестовом сервисе создайте безвредный файл в каталоге тома, пересоздайте только тестовый контейнер командой docker compose up -d --force-recreate ИМЯ_СЕРВИСА и проверьте файл. Не используйте down -v; данные базы переносите по её официальной процедуре.Linux · Терминал (Bash)С осторожностьюПересоздаёт указанный сервис, может вызвать простой; тестируйте до публикации.
docker compose up -d --force-recreate ИМЯ_СЕРВИСАКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
#Как проверить результат
После повторного создания тестового контейнера файл в томе остаётся на месте. Для БД отдельно убедитесь, что сохранены таблицы и доступно восстановление из резервной копии.
#Если проблема осталась
Не повторяйте опасные действия на рабочем окружении. Сравните первоначальный симптом с новым состоянием, сохраните обезличенные сообщения и версии компонентов, проверьте резервную копию; перед изменением общей истории Git или данных/сети Docker обратитесь к ответственному администратору проекта.