Een meer op zichzelf staande benadering:
- maak javascript-bestanden die uw database initialiseren
- maak een afgeleide MongoDB docker-afbeelding die deze bestanden bevat
Er zijn veel antwoorden die wegwerpcontainers gebruiken of volumes creëren en koppelen, maar dit lijkt te ingewikkeld. Als je de docker-entrypoint.sh van de mongo docker-afbeelding bekijkt, zie je dat regel 206 /docker-entrypoint-initdb.d/*.js
uitvoert bestanden bij initialisatie met behulp van een syntaxis:mongo <db> <js-file>
. Als u een afgeleide MongoDB-docker-image maakt die uw seed-gegevens bevat, kunt u:
- een enkele docker-opdracht uitvoeren die een mongo op de been houdt met seed-gegevens
- gegevens worden bewaard door het stoppen en starten van containers
- reset die gegevens met docker stop-, rm- en run-commando's
- gemakkelijk implementeren met runtime-planners zoals k8s, mesos, swarm, rancher
Deze aanpak is vooral geschikt voor:
- POC's die alleen wat realistische gegevens nodig hebben voor weergave
- CI/CD-pijplijnen die consistente gegevens nodig hebben voor black box-testen
- voorbeeldimplementaties voor productdemo's (verkoopingenieurs, producteigenaren)
Hoe:
- Maak en test uw initialisatiescripts (groominggegevens indien van toepassing)
-
Maak een Dockerfile voor uw afgeleide afbeelding die uw init-scripts kopieert
FROM mongo:3.4 COPY seed-data.js /docker-entrypoint-initdb.d/
-
Bouw uw docker-imago
docker build -t mongo-sample-data:3.4 .
-
U kunt uw afbeelding eventueel naar een docker-register pushen zodat anderen ze kunnen gebruiken
-
Voer uw docker-afbeelding uit
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 past standaard uw scripts toe op de test
db; de bovenstaande opdracht env var MONGO_INITDB_DATABASE=application
zal deze scripts toepassen op de application
db in plaats daarvan. Als alternatief kunt u verschillende dbs in het js-bestand maken en er naar overschakelen.
Ik heb een github-repo die precies dit doet - hier zijn de relevante bestanden.