Чтобы восстановить именованный том Docker Compose в macOS, остановите службы, которые выполняют в него запись, определите точное имя тома Docker и распакуйте архив резервной копии в этот том с помощью временного контейнера. Docker Desktop хранит тома Linux внутри своей виртуальной машины Linux, поэтому используйте Docker CLI для доступа к ним, а не пытайтесь редактировать внутренние файлы Docker в Finder. Руководство по томам Docker объясняет метод восстановления на основе контейнеров, а обзор сети Docker Desktop описывает виртуальную машину Linux, используемую на Mac.

Перед восстановлением: проверьте архив и проект Compose

Убедитесь, что Docker Desktop запущен, затем откройте «Терминал» и перейдите в каталог с вашим файлом Compose. Найдите архив в Finder или проверьте его имя в «Терминале». В приведенных ниже примерах предполагается, что он называется backup.tar и находится в папке backup-files; скорректируйте эти значения в соответствии с вашими файлами.

Перед распаковкой проверьте содержимое архива. Это поможет понять, хранятся ли файлы непосредственно в корне архива или во вложенном каталоге, например data/.

tar -tf "$HOME/backup-files/backup.tar" | head -30

Команда head ограничивает вывод первыми 30 путями; она не изменяет архив. Обратите внимание, начинаются ли пути с префикса каталога. Вам потребуется извлечь данные на нужном уровне в рабочий каталог приложения. В документации Docker используется параметр --strip 1, поскольку архив содержит каталог верхнего уровня; не используйте этот параметр автоматически, если в вашем архиве нет такого префикса. Пример восстановления Docker показывает, как путь извлечения влияет на структуру восстановленных данных.

Определите точное имя тома

Ключ тома в Compose, например db-data, может не совпадать с полным именем тома Docker. Compose обычно добавляет имя проекта в качестве префикса, однако том, настроенный с помощью name: или external: true, может использовать другое имя. Справочник по томам Compose объясняет эти параметры именования.

Выведите список томов и проверьте конфигурацию Compose, чтобы определить, какой именно том использует ваша служба:

docker volume ls
docker compose config

В отображенной конфигурации Compose найдите сопоставление томов службы и результирующее имя тома. Если вам нужно проверить подходящий вариант, выполните команду docker volume inspect VOLUME_NAME, заменив VOLUME_NAME фактическим именем. Прежде чем продолжить, убедитесь, что он принадлежит нужному проекту и службе; восстановление не в тот том может привести к перезаписи посторонних данных.

Остановите службы, пишущие данные, и восстановите резервную копию

Остановите службы Compose перед восстановлением, чтобы приложение не изменяло файлы в процессе распаковки. Выполнение команды docker compose down останавливает и удаляет контейнеры и сети проекта; по умолчанию именованные тома сохраняются. Избегайте добавления флагов -v или --volumes, которые удаляют именованные тома, управляемые Compose. Такое поведение описано в справочнике по compose down Docker.

docker compose down

Задайте переменную оболочки с точным именем тома, которое вы определили, а затем распакуйте архив с помощью временного контейнера. В этом примере используется официальный образ alpine, папка резервной копии монтируется только для чтения, а целевой том монтируется в точку /restore. Замените myproject_db-data, если ваше фактическое имя отличается. Образ должен быть доступен локально, либо Docker должен иметь возможность загрузить его.

VOLUME_NAME='myproject_db-data'
BACKUP_DIR="$HOME/backup-files"

docker run --rm \
  --mount "type=volume,source=$VOLUME_NAME,target=/restore" \
  --mount "type=bind,source=$BACKUP_DIR,target=/backup,readonly" \
  alpine sh -c 'cd /restore && tar -xf /backup/backup.tar --strip-components=1'

Эта команда предполагает, что архив содержит один уровень вложенности каталогов, например data/file.db. Если при просмотре содержимого архива файлы находились прямо в корне, удалите --strip-components=1. Если пути содержат другой общий префикс, выберите соответствующее количество удаляемых компонентов, чтобы нужные приложению файлы попали непосредственно в /restore. Синтаксис --mount явно подключает именованный том и каталог хоста; Docker документирует эти параметры монтирования и шаблон восстановления в своем руководстве по томам.

Распаковка заменяет файлы с совпадающими путями, но не удаляет посторонние файлы, уже находящиеся в томе. Если вам нужна точная копия архива, извлечения методом слияния недостаточно: сначала создайте отдельную резервную копию текущего тома, а затем выполните процедуру целенаправленной очистки после проверки архива и целевого тома. Не выполняйте команды общего удаления в отношении тома, который вы не идентифицировали однозначно.

Запустите проект и проверьте результат

Запустите службы Compose снова:

docker compose up -d

Compose повторно использует существующий том, объявленный в проекте, а если он отсутствует — создаст его. Такое поведение описано в справочнике по томам Compose. Проверьте журналы служб и, если применимо, запустите встроенные средства проверки целостности приложения или восстановления базы данных. Прежде чем считать восстановление завершенным, убедитесь, что ожидаемые записи или файлы на месте.

Если служба сообщает о пустом каталоге данных, перепроверьте имя тома, путь к каталогу на хосте и структуру каталогов архива. Также убедитесь, что архив совместим с версией приложения, а резервная копия была создана в состоянии, пригодном для восстановления приложения. Успешная распаковка tar подтверждает лишь то, что файлы были извлечены; она не гарантирует валидность данных приложения.

Источники