Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Initialize data on dockerized mongo

Tags:

I'm running a dockerized mongo container.

I'd like to create a mongo image with some initialized data.

Any ideas?

like image 279
Jordi Avatar asked Sep 06 '16 11:09

Jordi


People also ask

Can you Dockerize database?

Docker is great for running databases in a development environment! You can even use it for databases of small, non-critical projects which run on a single server.


1 Answers

A more self-contained approach:

  • create javascript files that initialize your database
  • create a derived MongoDB docker image that contains these files

There are many answers that use disposable containers or create volumes and link them, but this seems overly complicated. If you take a look at the mongo docker image's docker-entrypoint.sh, you see that line 206 executes /docker-entrypoint-initdb.d/*.js files on initialization using a syntax: mongo <db> <js-file>. If you create a derived MongoDB docker image that contains your seed data, you can:

  • have a single docker run command that stands up a mongo with seed data
  • have data is persisted through container stops and starts
  • reset that data with docker stop, rm, and run commands
  • easily deploy with runtime schedulers like k8s, mesos, swarm, rancher

This approach is especially well suited to:

  • POCs that just need some realistic data for display
  • CI/CD pipelines that need consistent data for black box testing
  • example deployments for product demos (sales engineers, product owners)

How to:

  1. Create and test your initialization scripts (grooming data as appropriate)
  2. Create a Dockerfile for your derived image that copies your init scripts

    FROM mongo:3.4 COPY seed-data.js /docker-entrypoint-initdb.d/ 
  3. Build your docker image

    docker build -t mongo-sample-data:3.4 . 
  4. Optionally, push your image to a docker registry for others to use

  5. Run your docker image

    docker run                               \     --name mongo-sample-data             \     -p 27017:27017                       \     --restart=always                     \     -e MONGO_INITDB_DATABASE=application \     -d mongo-sample-data:3.4 

By default, docker-entrypoint.sh will apply your scripts to the test db; the above run command env var MONGO_INITDB_DATABASE=application will apply these scripts to the application db instead. Alternatively, you could create and switch to different dbs in the js file.

I have a github repo that does just this - here are the relevant files.

like image 68
Steve Tarver Avatar answered Oct 14 '22 00:10

Steve Tarver