Nano Hash - криптовалюты, майнинг, программирование

Инициализировать данные на докеризованном монго

Я запускаю докеризованный контейнер монго.

Я хотел бы создать изображение монго с некоторыми инициализированными данными.

Любые идеи?

06.09.2016

  • Я абсолютно понятия не имею. Насколько я понял, я могу попробовать использовать докеризованную оболочку sudo docker exec -it mongo mongo. Однако каждый раз мне нужно снова сбрасывать все данные. 06.09.2016
  • Вам нужно запустить ранее созданный контейнер, чтобы получить те же данные, что и раньше. В противном случае docker создает новый контейнер со свежей базой данных, см. этот ответ 06.09.2016
  • Это хорошо обсуждается с предложением запустить mongoimport в одноразовом контейнере для заполнения вашей базы данных на stackoverflow.com/a/ 33397913/174843 06.09.2016
  • @VinceBowdren Я бы не рекомендовал эту технику. Он копирует начальные данные в изображение (COPY init.json /init.json). В образ не должны попадать конфиденциальные данные (включая пароли, сертификаты, данные базы данных). 06.09.2016

Ответы:


1

Сначала создайте том докера

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. Я перечислю два случая.

  1. Местная среда

    Вы используете Docker для Mac/Windows или Docker Toolbox. В этом случае вы можете легко смонтировать локальный диск во временный контейнер для инициализации тома. Например:

    docker run --rm -v /Users/myname/work/mongodb:/incoming \
      -v mongostore:/data alpine:3.4 cp -rp /incoming/* /data
    

    Это не работает для облачного хранилища. В этом случае вам необходимо скопировать файлы .

  2. Удаленная среда (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
    

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

Отказ от ответственности. Пишу по памяти (без проверки).

06.09.2016
  • Я уже думал об этом. Однако это хороший подход, я создаю демо-среду. Таким образом, эта демонстрационная среда должна быть настроена на любом компьютере, который нам нужен. Решением было бы создать том данных в виде образа и вытащить его. Является ли это возможным? 06.09.2016
  • Я добавлю больше информации о том, как инициализировать данные тома, о чем вы просите. 06.09.2016
  • Идеальный! Каково содержание входящего ot mongodata.tar.gz. Думаю, я хочу создать базу данных dbOne и две коллекции col1 и col2 и вставить в них некоторые данные. Как мне это сделать? 06.09.2016
  • Вы можете начать с пустого тома, как я описал сначала, позволить mongo создать начальные данные, а затем создать в нем ваши начальные данные (коллекции). Затем вы можете использовать метод, который я показал далее, но в обратном порядке, чтобы скопировать данные с тома на ваш локальный хост (или S3 или куда-либо еще). например: docker 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.2016
  • Это то, что находится в томе mongostore. Том монтируется в /data в контейнере, и это то, что tar'd/gzip'd. Помните, что это тот же том, который установлен в контейнере mongo. У него есть база данных монго. 06.09.2016
  • После создания mongostore как я могу вставить в него данные или создать базу данных без клиента mongo? 06.09.2016
  • Давайте продолжим обсуждение в чате. 06.09.2016
  • Нет необходимости делать docker volume create, если вам не нужны другие параметры, он сделает это за вас на docker run. А именованные тома инициализируются содержимым точки монтирования в образе, когда вы docker run используете пустой/новый том, что упрощает инициализацию (это не относится к хост-томам). 06.09.2016
  • @BMitch Это правильно. Нет необходимости в дополнительной инструкции по созданию тома. На мой взгляд, это просто делает шаги более понятными (показывает, что объем действительно не зависит от контейнера). Я также использую разные драйверы томов, поэтому я просто привык создавать их самостоятельно. Ваше здоровье. 07.09.2016

  • 2

    Более автономный подход:

    • создавать файлы javascript, которые инициализируют вашу базу данных
    • создайте производный образ докера MongoDB, содержащий эти файлы

    Есть много ответов, которые используют одноразовые контейнеры или создают тома и связывают их, но это кажется слишком сложным. Если вы посмотрите на docker-entrypoint образа mongo docker .sh вы видите, что строка 206 выполняет /docker-entrypoint-initdb.d/*.js файлов при инициализации с использованием синтаксиса: mongo <db> <js-file>. Если вы создаете производный образ докера MongoDB, содержащий исходные данные, вы можете:

    • иметь единую команду запуска докера, которая запускает монго с начальными данными
    • данные сохраняются через остановки и запуски контейнера
    • сбросьте эти данные с помощью команд docker stop, rm и run
    • легко развертывать с помощью планировщиков времени выполнения, таких как k8s, mesos, swarm, rancher

    Этот подход особенно хорошо подходит для:

    • POC, которым просто нужны реалистичные данные для отображения
    • Конвейеры CI/CD, которым нужны согласованные данные для тестирования «черного ящика»
    • примеры развертывания для демонстрации продуктов (инженеры по продажам, владельцы продуктов)

    Как:

    1. Создайте и протестируйте свои сценарии инициализации (при необходимости обработайте данные)
    2. Создайте Dockerfile для вашего производного образа, который копирует ваши сценарии инициализации.

      FROM mongo:3.4
      COPY seed-data.js /docker-entrypoint-initdb.d/
      
    3. Создайте свой образ докера

      docker build -t mongo-sample-data:3.4 .
      
    4. При желании отправьте образ в реестр докеров, чтобы другие могли его использовать.

    5. Запустите образ докера

      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, который делает именно это — вот соответствующие файлы.

    23.04.2017
  • Это не только должно быть ответом, но и упрощает подключение к docker-compose. 19.08.2018

  • 3

    с последней версией 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> .
    
    29.09.2018

    4

    Вот как это делается с помощью 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. Ваше здоровье!

    10.04.2019
  • Спасибо за это. Мне пришлось поделиться им примерно так: - ./deploy/local/mongo_fixtures:/fixtures иначе файлы не были правильно переданы 16.06.2020

  • 5

    Я нашел способ, который как-то проще для меня.

    Допустим, у вас есть база данных в док-контейнере на вашем сервере, и вы хотите создать ее резервную копию, вот что вы можете сделать.

    Что может отличаться от вашей установки для моей, так это имя вашего контейнера док-станции 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

    Благодарю вас!

    25.02.2017
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..