Un enfoque más autónomo:
- cree archivos javascript que inicialicen su base de datos
- cree una imagen acoplable derivada de MongoDB que contenga estos archivos
Hay muchas respuestas que usan contenedores desechables o crean volúmenes y los vinculan, pero esto parece demasiado complicado. Si observa el docker-entrypoint.sh de la imagen docker de mongo, verá que la línea 206 ejecuta /docker-entrypoint-initdb.d/*.js
archivos en la inicialización usando una sintaxis:mongo <db> <js-file>
. Si crea una imagen acoplable derivada de MongoDB que contiene sus datos semilla, puede:
- tener un solo comando de ejecución de la ventana acoplable que levanta un mongo con datos semilla
- tener datos persistentes a través de paradas e inicios del contenedor
- restablezca esos datos con los comandos docker stop, rm y run
- implemente fácilmente con programadores de tiempo de ejecución como k8s, mesos, swarm, rancher
Este enfoque es especialmente adecuado para:
- POC que solo necesitan algunos datos realistas para mostrar
- Tubos de CI/CD que necesitan datos consistentes para pruebas de caja negra
- implementaciones de ejemplo para demostraciones de productos (ingenieros de ventas, propietarios de productos)
Cómo:
- Cree y pruebe sus scripts de inicialización (datos de preparación según corresponda)
-
Cree un Dockerfile para su imagen derivada que copie sus scripts de inicio
FROM mongo:3.4 COPY seed-data.js /docker-entrypoint-initdb.d/
-
Cree su imagen acoplable
docker build -t mongo-sample-data:3.4 .
-
Opcionalmente, envíe su imagen a un registro acoplable para que otros la usen
-
Ejecute su imagen acoplable
docker run \ --name mongo-sample-data \ -p 27017:27017 \ --restart=always \ -e MONGO_INITDB_DATABASE=application \ -d mongo-sample-data:3.4
De forma predeterminada, docker-entrypoint.sh aplicará sus scripts a la test
base de datos; el comando de ejecución anterior env var MONGO_INITDB_DATABASE=application
aplicará estos scripts a la application
db en su lugar. Alternativamente, puede crear y cambiar a diferentes bases de datos en el archivo js.
Tengo un repositorio de github que hace exactamente esto:aquí están los archivos relevantes.