Предполагая, что проект был зарезервирован с помощью следующего скрипта:

https://gist.githubusercontent.com/pirate/265e19a8a768a48cf12834ec87fb0eed/raw/64145b8275a081e0c3082365bb1a5835c8b01b3c/docker-compose-backup.sh

И у меня есть сжатый tar-архив с полной резервной копией, есть ли какой-нибудь «однострочный» способ успешно восстановить и запустить проект на чистой машине?

0
Kevin Sanders 19 Ноя 2019 в 21:34
Не предоставляйте внешние ссылки, которые будут изменены позже. попробуйте поставить соответствующий код под вопрос
 – 
prisar
19 Ноя 2019 в 22:14

1 ответ

Стандартный сценарий восстановления Docker «ой, я потерял все свои контейнеры» должен быть примерно

# Get a copy of the repository with docker-compose.yml
git clone git@github.com:...

# Unpack a backup specifically of the bind-mounted
# data directories
tar xzf data-backup.tar.gz

# Recreate all of the containers from scratch
docker-compose up -d --build

Для этого необходимо убедиться, что все данные в вашем приложении хранятся где-то за пределами отдельных контейнеров Docker. В настройке Docker Compose это означает использование директив volumes: для хранения данных в другом месте. Типичная практика заключается в том, чтобы хранить как можно больше данных в базах данных и вообще не иметь постоянных данных в контейнерах, отличных от баз данных. Если вы беспокоитесь о потере всего дерева /var/lib/docker, отдайте предпочтение привязке монтирования к именованным томам и используйте любое обычное решение для резервного копирования, которое вы обычно используете для резервного копирования соответствующих каталогов хоста.

Сценарий, который вы показываете, пытается сохранить ряд вещей, которые просто не нуждаются в резервном копировании:

  • Если вы сохраняете каталог данных контейнера базы данных в смонтированном привязке хост-каталоге, вам не нужно отдельно делать резервную копию на уровне базы данных (хотя это и не помешает).
  • docker inspect — крайне низкоуровневый диагностический инструмент, и обычно его запускать бесполезно; из него ничего нельзя восстановить
  • Вам не нужно docker save образы, потому что они находятся во внешнем реестре Docker (Docker Hub, AWS ECR, ...), и независимо от того, вы проверили их файлы Docker в системе управления версиями и можете их восстановить.
  • Вам не нужно docker export отдельные контейнеры, потому что они не хранят изменяемые данные, и вам в любом случае нужно очень регулярно их уничтожать.

Единственное, что он делает, — это использует хорошо известные внутренние детали Docker для резервного копирования содержимого именованных томов. Ручной доступ к файлам в /var/lib/docker обычно не является лучшей практикой, и фактический формат файлов не гарантируется. Документация Docker обсуждает резервное копирование и восстановление именованных томов< /a> более переносимым способом (но я считаю, что монтирование с привязкой гораздо удобнее).

2
David Maze 19 Ноя 2019 в 22:01
Спасибо, что поделились своими опасениями, однако это не соответствует моему вопросу. Дело не в лучших практиках. Резервное копирование уже выполнено в формате, явно указанном в сценарии (то есть <время резервного копирования>.tar.gz). Я ищу однострочник, который будет извлекать содержимое архива, создавать образы локально и запускать его (без клонирования репо или подключения к внешним реестрам Docker).
 – 
Kevin Sanders
20 Ноя 2019 в 00:40