#Как проявляется проблема и где искать причину
Перед обновлением контейнера нужно сохранять не только его образ, но и содержимое используемых именованных томов. Для работающей СУБД простая копия каталога может быть несогласованной — предпочтительна штатная логическая или снимковая копия.
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Данные в томеПапка базы/загрузок примонтирована из Docker volume | docker inspect показывает Mounts Type=volume | Резервировать конкретный том |
| Файлы меняются во время копированияРабочая база пишет в том одновременно с tar | Архив может содержать файлы разного состояния | Остановить запись или применить штатную копию СУБД |
#Пошаговая диагностика и устранение
- 1. Составьте карту томов приложенияВыберите контейнер и выполните inspect. В Mounts запишите Type, Source, Destination и имя тома. У bind mount резервируется каталог хоста, для named volume — содержимое volume.
- Чтение; имя тома видно в Name для Type=volumeLinux · Терминал (Bash)КомандаЧтение; имя тома видно в Name для Type=volume.
docker inspect --format "{{json .Mounts}}" ИМЯ_КОНТЕЙНЕРА
- 2. Убедитесь, что том действительно существуетСверьте список именованных томов и укажите точное имя в дальнейших действиях. Если вы видите Bind, не используйте схему архива именованного тома — сохраните исходный каталог по правилам ОС.
- Чтение; не запускайте docker volume pruneLinux · Терминал (Bash)КомандаЧтение; не запускайте docker volume prune.
docker volume ls
- 3. Обеспечьте согласованное состояниеЕсли том содержит MySQL, PostgreSQL, SQLite или другую базу, сначала получите проверенную логическую копию штатными средствами либо используйте корректный снимок с паузой записи. Для файлового хранилища запланируйте окно обслуживания и временно остановите запись; проверьте, что приложение не меняет файлы во время архивации.
- 4. Создайте папку для копии на хостеВ терминале Linux/macOS создайте отдельный каталог вне тома Docker и перейдите в него. Убедитесь, что там достаточно свободного места и права доступа ограничены.
- На Linux/macOS; для PowerShell используйте New-Item и Set-LocationLinux · Терминал (Bash)КомандаНа Linux/macOS; для PowerShell используйте New-Item и Set-Location.
mkdir -p "$HOME/docker-volume-backup" && cd "$HOME/docker-volume-backup"
- 5. Сделайте архив выбранного томаПосле согласованной остановки записи выполните команду с заменой ИМЯ_ТОМА. Том монтируется только для чтения; архив пишется в текущую папку хоста. Потребуется доступ к Docker и разрешение образа alpine в вашей сети.Linux · Терминал (Bash)С осторожностьюLinux/macOS shell; данные не модифицируются, но архив может содержать секреты.
docker run --rm --mount type=volume,src=ИМЯ_ТОМА,dst=/data,readonly --mount type=bind,src="$(pwd)",dst=/backup alpine tar -czf /backup/volume-backup.tgz -C /data .Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- 6. Проверьте целостность архиваУбедитесь, что файл существует и tar способен прочесть заголовки. Важно: это не доказывает консистентность базы данных; нужна отдельная проверка приложения на восстановленной копии.
- Linux/macOS; чтение архива, имена файлов могут быть конфиденциальнымиLinux · Терминал (Bash)КомандаLinux/macOS; чтение архива, имена файлов могут быть конфиденциальными.
tar -tzf volume-backup.tgz | head -30
- 7. Проведите пробное восстановление на другом томеСоздайте новый тестовый том с уникальным именем и восстановите архив только в него, после проверки отсутствия существующих данных. Не используйте имя рабочего тома и не переключайте рабочее приложение на пробную копию.
- Создаёт отдельный том; предварительно убедитесь, что том с таким именем не существуетLinux · Терминал (Bash)С осторожностьюСоздаёт отдельный том; предварительно убедитесь, что том с таким именем не существует.
docker volume create whelp-restore-testКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- 8. Проверьте приложение и срок храненияВ изолированном тесте восстановите файл в созданный том по официальной инструкции Docker Volumes и проверьте открытие данных и контрольные записи. Запишите дату, версию образа, имя тома, место хранения и время восстановления. Затем обновляйте контейнер в согласованное окно.
#Как проверить результат
Есть датированный архив, восстановление прошло на отдельном томе, приложение видит контрольные записи; только после этого обновляйте рабочий образ.
#Если исправление не помогло
Если база активно изменяется и невозможно обеспечить согласованную копию, не считайте tar полноценным резервированием. Используйте резервирование уровня СУБД с проверкой восстановления.