Uma abordagem mais independente:
- crie arquivos javascript que inicializem seu banco de dados
- crie uma imagem de encaixe do MongoDB derivada que contenha esses arquivos
Existem muitas respostas que usam recipientes descartáveis ou criam volumes e os vinculam, mas isso parece muito complicado. Se você der uma olhada no docker-entrypoint.sh da imagem do docker mongo, verá que a linha 206 executa
/docker-entrypoint-initdb.d/*.js
arquivos na inicialização usando uma sintaxe:mongo <db> <js-file>
. Se você criar uma imagem de encaixe do MongoDB derivada que contenha seus dados de semente, você poderá:- tenha um único comando de execução do docker que levanta um mongo com dados de semente
- os dados são persistidos por meio de paradas e inícios de contêiner
- redefina esses dados com os comandos docker stop, rm e run
- implante facilmente com agendadores de tempo de execução como k8s, mesos, swarm, rancher
Esta abordagem é especialmente adequada para:
- POCs que precisam apenas de alguns dados realistas para exibição
- pipelines CI/CD que precisam de dados consistentes para testes de caixa preta
- exemplos de implantações para demonstrações de produtos (engenheiros de vendas, proprietários de produtos)
Como:
- Crie e teste seus scripts de inicialização (limpando os dados conforme apropriado)
-
Crie um Dockerfile para sua imagem derivada que copia seus scripts de inicialização
FROM mongo:3.4 COPY seed-data.js /docker-entrypoint-initdb.d/
-
Crie sua imagem docker
docker build -t mongo-sample-data:3.4 .
-
Opcionalmente, envie sua imagem para um registro docker para que outras pessoas usem
-
Execute sua imagem do docker
docker run \ --name mongo-sample-data \ -p 27017:27017 \ --restart=always \ -e MONGO_INITDB_DATABASE=application \ -d mongo-sample-data:3.4
Por padrão, docker-entrypoint.sh aplicará seus scripts ao
test
banco de dados; o comando de execução acima env var MONGO_INITDB_DATABASE=application
irá aplicar estes scripts à application
db em vez disso. Como alternativa, você pode criar e alternar para diferentes dbs no arquivo js. Eu tenho um repositório do github que faz exatamente isso - aqui estão os arquivos relevantes.