Я запускаю докеризованный контейнер монго.
Я хотел бы создать изображение монго с некоторыми инициализированными данными.
Любые идеи?
Я запускаю докеризованный контейнер монго.
Я хотел бы создать изображение монго с некоторыми инициализированными данными.
Любые идеи?
sudo docker exec -it mongo mongo
. Однако каждый раз мне нужно снова сбрасывать все данные. 06.09.2016 COPY init.json /init.json
). В образ не должны попадать конфиденциальные данные (включая пароли, сертификаты, данные базы данных). 06.09.2016 Сначала создайте том докера
docker volume create --name mongostore
затем создайте свой контейнер монго
docker run -d --name mongo -v mongostore:/data/db mongo:latest
Переключатель -v
здесь отвечает за монтирование тома mongostore
в местоположении /data/db
, где монго сохраняет свои данные. Том является постоянным (на хосте). Даже если контейнеры не запущены, вы увидите свой том mongostore в списке
docker volume ls
Вы можете убить контейнер и создать новый (та же строка, что и выше), и новый контейнер монго получит состояние предыдущего контейнера.
Инициализация тома Mongo инициализирует новую базу данных, если ее нет. Это отвечает за создание исходных данных в mongostore. Допустим, вы хотите создать совершенно новую среду, используя предварительно заполненную базу данных. Проблема заключается в том, как перенести данные из вашей локальной среды (например) на том перед созданием контейнера mongo. Я перечислю два случая.
Местная среда
Вы используете Docker для Mac/Windows или Docker Toolbox. В этом случае вы можете легко смонтировать локальный диск во временный контейнер для инициализации тома. Например:
docker run --rm -v /Users/myname/work/mongodb:/incoming \
-v mongostore:/data alpine:3.4 cp -rp /incoming/* /data
Это не работает для облачного хранилища. В этом случае вам необходимо скопировать файлы .
Удаленная среда (AWS, GCP, Azure, ...)
Это хорошая идея, чтобы ускорить загрузку.
tar czf mongodata.tar.gz /Users/myname/work/mongodb
Затем создайте временный контейнер для распаковки и скопируйте файлы в mongostore. tail -f /dev/null
просто гарантирует, что контейнер не выйдет.
docker run -d --name temp -v mongostore:/data alpine:3.4 tail -f /dev/null
Скопируйте на него файлы
docker cp mongodata.tar.gz temp:.
Разархивируйте и перейдите к тому
docker exec temp tar xzf mongodata.tar.gz && cp -rp mongodb/* /data
Очистка
docker rm temp
Вы также можете скопировать файлы на удаленный хост и смонтировать оттуда, но я стараюсь вообще избегать взаимодействия с удаленным хостом.
Отказ от ответственности. Пишу по памяти (без проверки).
Более автономный подход:
Есть много ответов, которые используют одноразовые контейнеры или создают тома и связывают их, но это кажется слишком сложным. Если вы посмотрите на docker-entrypoint образа mongo docker .sh вы видите, что строка 206 выполняет /docker-entrypoint-initdb.d/*.js
файлов при инициализации с использованием синтаксиса: mongo <db> <js-file>
. Если вы создаете производный образ докера MongoDB, содержащий исходные данные, вы можете:
Этот подход особенно хорошо подходит для:
Как:
Создайте Dockerfile для вашего производного образа, который копирует ваши сценарии инициализации.
FROM mongo:3.4
COPY seed-data.js /docker-entrypoint-initdb.d/
Создайте свой образ докера
docker build -t mongo-sample-data:3.4 .
При желании отправьте образ в реестр докеров, чтобы другие могли его использовать.
Запустите образ докера
docker run \
--name mongo-sample-data \
-p 27017:27017 \
--restart=always \
-e MONGO_INITDB_DATABASE=application \
-d mongo-sample-data:3.4
По умолчанию docker-entrypoint.sh применяет ваши сценарии к базе данных test
; приведенная выше команда запуска env var MONGO_INITDB_DATABASE=application
вместо этого применит эти сценарии к application
db. В качестве альтернативы вы можете создавать и переключаться на разные базы данных в файле js.
У меня есть репозиторий github, который делает именно это — вот соответствующие файлы а>.
с последней версией mongo docker у меня работает что-то вроде этого.
FROM mongo
COPY dump /home/dump
COPY mongo_restore.sh /docker-entrypoint-initdb.d/
сценарий восстановления монго выглядит так.
#!/bin/bash
# Restore from dump
mongorestore --drop --gzip --db "<RESTORE_DB_NAME>" /home/dump
и вы могли бы построить образ нормально.
docker build -t <TAG> .
Вот как это делается с помощью docker-compose. Я использую старый образ монго, но docker-entrypoint.sh
принимает файлы *.js и *.sh для всех версий образа.
docker-compose.yaml
version: '3'
services:
mongo:
container_name: mongo
image: mongo:3.2.12
ports:
- "27017:27017"
volumes:
- mongo-data:/data/db:cached
- ./deploy/local/mongo_fixtures /fixtures
- ./deploy/local/mongo_import.sh:/docker-entrypoint-initdb.d/mongo_import.sh
volumes:
mongo-data:
driver: local
монго_импорт.ш:
#!/bin/bash
# Import from fixtures
mongoimport --db wcm-local --collection clients --file /fixtures/properties.json && \
mongoimport --db wcm-local --collection configs --file /fixtures/configs.json
И мои файлы json monogo_fixtures являются продуктом monogoexport
и имеют следующий формат:
{"_id":"some_id","field":"value"}
{"_id":"another_id","field":"value"}
Это должно помочь тем, кто использует это без пользовательского Dockefile, просто используя образ сразу с правильной настройкой точки входа прямо в файле docker-compose. Ваше здоровье!
Я нашел способ, который как-то проще для меня.
Допустим, у вас есть база данных в док-контейнере на вашем сервере, и вы хотите создать ее резервную копию, вот что вы можете сделать.
Что может отличаться от вашей установки для моей, так это имя вашего контейнера док-станции mongo [mongodb
] (по умолчанию при использовании elastic_spence
). Поэтому убедитесь, что вы сначала запускаете свой контейнер с --name mongodb
, чтобы выполнить следующие шаги:
$ docker run \
--rm \
--link mongodb:mongo \
-v /root:/backup \
mongo \
bash -c ‘mongodump --out /backup --host $MONGO_PORT_27017_TCP_ADDR’
И восстановить базу из дампа.
$ docker run \
--rm \
--link mongodb:mongo \
-v /root:/backup \
mongo \
bash -c ‘mongorestore /backup --host $MONGO_PORT_27017_TCP_ADDR’
Если вам нужно загрузить дамп на свой сервер, вы можете использовать scp:
$ scp -r root@IP:/root/backup ./backup
Или загрузите его:
$ scp -r ./backup root@IP:/root/backup
P.S. Исходный код Тима Брандина доступен по адресу https://blog.studiointeract.com/mongodump-and-mongorestore-for-mongodb-in-a-docker-container-8ad0eb747c62
Благодарю вас!
mongodata.tar.gz
. Думаю, я хочу создать базу данныхdbOne
и две коллекцииcol1
иcol2
и вставить в них некоторые данные. Как мне это сделать? 06.09.2016docker run -d --name temp -v mongostore:/data alpine:3.4 tar czf data.tar.gz /data/* && tail -f /dev/null
, а затемdocker cp temp:data.tar.gz .
06.09.2016mongostore
как я могу вставить в него данные или создать базу данных без клиента mongo? 06.09.2016docker volume create
, если вам не нужны другие параметры, он сделает это за вас наdocker run
. А именованные тома инициализируются содержимым точки монтирования в образе, когда выdocker run
используете пустой/новый том, что упрощает инициализацию (это не относится к хост-томам). 06.09.2016