Une approche plus autonome :
- créer des fichiers javascript qui initialisent votre base de données
- créer une image docker MongoDB dérivée contenant ces fichiers
Il existe de nombreuses réponses qui utilisent des contenants jetables ou créent des volumes et les relient, mais cela semble trop compliqué. Si vous regardez le docker-entrypoint.sh de l'image mongo docker, vous voyez que la ligne 206 exécute /docker-entrypoint-initdb.d/*.js
fichiers à l'initialisation en utilisant une syntaxe :mongo <db> <js-file>
. Si vous créez une image docker MongoDB dérivée qui contient vos données de départ, vous pouvez :
- avoir une seule commande d'exécution docker qui lève un mongo avec des données de départ
- les données sont conservées pendant les arrêts et les démarrages du conteneur
- réinitialisez ces données avec les commandes docker stop, rm et run
- déploiement facile avec des planificateurs d'exécution tels que k8s, mesos, swarm, rancher
Cette approche est particulièrement bien adaptée pour :
- Les POC qui ont juste besoin de données réalistes pour l'affichage
- Pipelines CI/CD nécessitant des données cohérentes pour les tests de boîte noire
- exemples de déploiements pour les démonstrations de produits (ingénieurs commerciaux, propriétaires de produits)
Comment :
- Créez et testez vos scripts d'initialisation (nettoyage des données le cas échéant)
-
Créez un Dockerfile 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 docker
docker build -t mongo-sample-data:3.4 .
-
Éventuellement, poussez votre image vers un registre docker pour que d'autres puissent l'utiliser
-
Exécutez votre image docker
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 au test
db ; la commande d'exécution ci-dessus env var MONGO_INITDB_DATABASE=application
appliquera ces scripts à l'application
db à la place. Alternativement, vous pouvez créer et basculer vers différentes bases de données dans le fichier js.
J'ai un référentiel github qui fait exactement cela - voici les fichiers pertinents.