J'utilise un conteneur dongo mongo.
J'aimerais créer une image mongo avec des données initialisées.
Des idées?
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.
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.
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).
Une approche plus autonome:
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:
Cette approche est particulièrement bien adaptée pour:
Comment:
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/
Construisez votre image de docker
docker build -t mongo-sample-data:3.4 .
Facultativement, envoyez votre image dans un registre de docker pour que d'autres puissent l'utiliser.
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 .
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> .
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!