web-dev-qa-db-fra.com

Initialiser les données sur le mongo dockerized

J'utilise un conteneur dongo mongo.

J'aimerais créer une image mongo avec des données initialisées.

Des idées?

12
Jordi

Commencez par créer un volume de menu fixe

docker volume create --name mongostore

puis créez votre conteneur mongo

docker run -d --name mongo -v mongostore:/data/db mongo:latest

Le commutateur -v est ici responsable du montage du volume mongostore à l'emplacement /data/db, où mongo enregistre ses données. Le volume est persistant (sur l'hôte). Même si aucun conteneur ne fonctionne, vous verrez le volume de votre magasin à mémoire répertorié par

docker volume ls

Vous pouvez tuer le conteneur et en créer un nouveau (même ligne que ci-dessus) et le nouveau conteneur mongo récupérera l'état du conteneur précédent.

Initialisation du volume Mongo initialise une nouvelle base de données si aucune n’est présente. Ceci est responsable de la création des données initiales dans le mongostore. Supposons que vous souhaitiez créer un nouvel environnement en utilisant une base de données pré-établie. Le problème consiste à savoir comment transférer des données de votre environnement local (par exemple) vers le volume avant de créer le conteneur Mongo. Je vais énumérer deux cas.

  1. Environnement local

    Vous utilisez Docker pour Mac/Windows ou Docker Toolbox. Dans ce cas, vous pouvez facilement monter un lecteur local sur un conteneur temporaire pour initialiser le volume. Par exemple:

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

    Cela ne fonctionne pas pour le stockage en nuage. Dans ce cas, vous devez copier les fichiers.

  2. Environnement distant (AWS, GCP, Azure, ...)

    C'est une bonne idée de tar/compresser les choses pour accélérer le téléchargement.

    tar czf mongodata.tar.gz /Users/myname/work/mongodb
    

    Créez ensuite un conteneur temporaire pour décompresser et copier les fichiers dans le magasin de mémoire. le tail -f /dev/null s'assure simplement que le conteneur ne se ferme pas.

    docker run -d --name temp -v mongostore:/data Alpine:3.4 tail -f /dev/null
    

    Copier les fichiers

    docker cp mongodata.tar.gz temp:.
    

    Décompresser et passer au volume

    docker exec temp tar xzf mongodata.tar.gz && cp -rp mongodb/* /data
    

    Nettoyer 

    docker rm temp
    

Vous pouvez également copier les fichiers sur l'hôte distant et les monter à partir de là, mais j'ai tendance à éviter d'interagir avec l'hôte distant.

Avertissement. J'écris ceci de mémoire (pas de test).

4
Alkaline

Une approche plus autonome: 

  • créer des fichiers javascript qui initialisent votre base de données
  • créer une image dérivée du docker MongoDB contenant ces fichiers

De nombreuses réponses utilisent des conteneurs jetables ou créent des volumes et les relient, mais cela semble trop compliqué. Si vous examinez le fichier docker-entrypoint.sh de l'image du docker mongo, vous voyez que la ligne 206 exécute les fichiers /docker-entrypoint-initdb.d/*.js lors de l'initialisation à l'aide de la syntaxe suivante: mongo <db> <js-file>. Si vous créez une image de menu fixe MongoDB contenant vos données de base, vous pouvez:

  • avoir une seule commande d'exécution du menu fixe qui lève un mongo avec des données de départ
  • avoir des données est persisté par des arrêts de conteneurs et commence
  • réinitialiser ces données avec les commandes docker stop, rm et run
  • déployez facilement avec des ordonnanceurs d'exécution tels que k8s, mesos, swarm, rancher

Cette approche est particulièrement bien adaptée pour:

  • POC qui ont juste besoin de données réalistes pour l'affichage
  • Pipelines CI/CD nécessitant des données cohérentes pour le test de la boîte noire
  • exemples de déploiements pour des démonstrations de produits (ingénieurs commerciaux, propriétaires de produits)

Comment:

  1. Créez et testez vos scripts d'initialisation (nettoyage des données, le cas échéant)
  2. Créez un fichier Docker pour votre image dérivée qui copie vos scripts d'initialisation.

    FROM mongo:3.4
    COPY seed-data.js /docker-entrypoint-initdb.d/
    
  3. Construisez votre image de docker

    docker build -t mongo-sample-data:3.4 .
    
  4. Facultativement, envoyez votre image dans un registre de docker pour que d'autres puissent l'utiliser.

  5. Exécuter votre image de menu fixe

    docker run                               \
        --name mongo-sample-data             \
        -p 27017:27017                       \
        --restart=always                     \
        -e MONGO_INITDB_DATABASE=application \
        -d mongo-sample-data:3.4
    

Par défaut, docker-entrypoint.sh appliquera vos scripts à la base de données test; la commande d'exécution ci-dessus env var MONGO_INITDB_DATABASE=application appliquera ces scripts à la base de données application. Alternativement, vous pouvez créer et basculer vers différents dbs dans le fichier js.

J'ai un repo github qui fait justement ceci - voici les fichiers pertinents .

25
Steve Tarver

avec la dernière version de mongo docker, quelque chose comme cela fonctionne pour moi.

FROM mongo
COPY dump /home/dump
COPY mongo_restore.sh /docker-entrypoint-initdb.d/

le script de restauration Mongo ressemble à ceci.

#!/bin/bash
# Restore from dump
mongorestore --drop --gzip --db "<RESTORE_DB_NAME>" /home/dump

et vous pouvez construire l'image normalement.

docker build -t <TAG> .
2
user10434757

J'ai trouvé un moyen qui est en quelque sorte plus facile pour moi.

Supposons que vous avez une base de données dans un conteneur Docker sur votre serveur et que vous souhaitez la sauvegarder, voici ce que vous pouvez faire.

Ce qui peut différer de votre configuration à la mienne est le nom de votre conteneur docker Mongo [mongodb] (par défaut avec elastic_spence). Assurez-vous donc de commencer par commencer votre conteneur avec --name mongodb pour correspondre aux étapes suivantes:

$ docker run \
 --rm \
 --link mongodb:mongo \
 -v /root:/backup \
 mongo \
 bash -c ‘mongodump --out /backup --Host $MONGO_PORT_27017_TCP_ADDR’

Et pour restaurer la base de données à partir d'un cliché.

$ docker run \
 --rm \
 --link mongodb:mongo \
 -v /root:/backup \
 mongo \
 bash -c ‘mongorestore /backup --Host $MONGO_PORT_27017_TCP_ADDR’

Si vous devez télécharger le dump de sur votre serveur, vous pouvez utiliser scp:

$ scp -r root@IP:/root/backup ./backup

Ou téléchargez-le:

$ scp -r ./backup root@IP:/root/backup

P.S: Source originale de Tim Brandin disponible sur https://blog.studiointeract.com/mongodump-and-mongorestore-for-mongodb-in-a-docker-container-8ad0eb747c62

Je vous remercie!

0
Musikolo