Сбросить образ докера с базой данных

Я хотел бы получить снимок из базы данных объемом 300 ГБ, провести некоторое тестирование, пока база данных не перестанет быть в тестируемом состоянии, а затем «сбросить» базу данных до состояния моментального снимка и снова протестировать.

Docker кажется подходящим для этого, но все, что я могу найти, это как настроить пустую базу данных с сервером sql.

Можно ли создать образ докера с установленным sqlserver и существующей базой данных размером 300 ГБ внутри образа? А потом снова дернуть образ, чтобы сбросить данные?

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
0
0
501
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Теоретически да. На практике вы столкнетесь с двумя большими проблемами:

  1. Все стандартные образы баз данных Docker Hub настроены таким образом, что их данные всегда находятся в томе. Это означает, что вы не можете создать изображение на основе стандартных изображений с предварительно загруженными данными; вам придется создать свой собственный базовый образ базы данных.

  2. Сетевой ввод-вывод Docker начинает работать неустойчиво с отдельными слоями, которые намного превышают 1 ГБ. Просто механика передачи 300-гигабайтного образа по сети будет хлопотной.

Есть также некоторые соображения в зависимости от того, как база данных внутренне хранит свои данные. Если есть один файл размером 300 ГБ, возможно, первая запись в него приведет к попытке скопировать его целиком. Это зависит от хранилища базы данных и низкоуровневых деталей ядра Linux, к которым у вас обычно нет доступа или контроля.

Возможно, лучше использовать систему томов Docker, чем пытаться заставить образ делать это за вас. Учтите, что вы можете запустить контейнер с внешними данными, остановить и удалить его, а затем запустить новый контейнер на основе тех же данных; если вы сохраните копию базовых файлов данных между ними, база данных не будет знать, что вы перезапускаете ее из моментального снимка.

Высмеивая это с помощью PostgreSQL, вы можете сделать что-то вроде:

# Start a database container, pointing at local data
docker run \
  -d \
  --name postgres \
  -p 5432:5432 \
  -v "$PWD:pgdata:/var/lib/postgresql/data" \
  postgres:13
# Seed the database
PGHOST=localhost PGPORT=5432 ./seed-data.py
# Stop the database
docker stop postgres
docker rm postgres
# Save a copy of the database data
tar cvzf pgdata.tar.gz pgdata

Затем каждый раз, когда вы хотите запустить тест, вы можете распаковать это сохраненное дерево данных.

rm -rf pgdata
tar xzf pgdata.tar.gz
docker run \
  -d \
  --name postgres \
  -p 5432:5432 \
  -v "$PWD:pgdata:/var/lib/postgresql/data" \
  postgres:13
PGHOST=localhost PGPORT=5432 ./integration-test.py

С 300 ГБ данных все равно потребуется некоторое время для распаковки и записи tar-файла, но это, по крайней мере, просто и зависит только от обычных инструментов.

Другие вопросы по теме