Un approccio più autonomo:
- crea file javascript che inizializzano il tuo database
- crea un'immagine Docker MongoDB derivata che contenga questi file
Ci sono molte risposte che utilizzano contenitori usa e getta o creano volumi e li collegano, ma questo sembra eccessivamente complicato. Se dai un'occhiata a docker-entrypoint.sh dell'immagine della finestra mobile mongo, vedrai che la riga 206 esegue /docker-entrypoint-initdb.d/*.js
file all'inizializzazione utilizzando una sintassi:mongo <db> <js-file>
. Se crei un'immagine Docker MongoDB derivata che contiene i tuoi dati seed, puoi:
- disponi di un singolo comando di esecuzione della finestra mobile che regga un mongo con i dati seed
- avere i dati viene mantenuto tramite arresti e riavvii del contenitore
- reimposta quei dati con i comandi docker stop, rm ed esegui
- facilmente implementabile con pianificatori di runtime come k8s, mesos, swarm, rancher
Questo approccio è particolarmente adatto a:
- POC che necessitano solo di alcuni dati realistici per la visualizzazione
- Condutture CI/CD che necessitano di dati coerenti per il test della scatola nera
- Esempio di implementazioni per demo di prodotti (tecnici di vendita, proprietari di prodotti)
Come:
- Crea e testa i tuoi script di inizializzazione (grooming dei dati a seconda dei casi)
-
Crea un Dockerfile per la tua immagine derivata che copia i tuoi script di inizializzazione
FROM mongo:3.4 COPY seed-data.js /docker-entrypoint-initdb.d/
-
Crea la tua immagine Docker
docker build -t mongo-sample-data:3.4 .
-
Facoltativamente, invia la tua immagine a un registro Docker affinché altri possano utilizzarla
-
Esegui la tua immagine Docker
docker run \ --name mongo-sample-data \ -p 27017:27017 \ --restart=always \ -e MONGO_INITDB_DATABASE=application \ -d mongo-sample-data:3.4
Per impostazione predefinita, docker-entrypoint.sh applicherà i tuoi script al test
db; il comando di esecuzione sopra env var MONGO_INITDB_DATABASE=application
applicherà questi script all'application
db invece. In alternativa, puoi creare e passare a db diversi nel file js.
Ho un repository github che fa proprio questo:ecco i file rilevanti.