Saltar al contenido

¿Cómo inicio una base de datos mongo usando docker-compose?

Posterior a consultar expertos en este tema, programadores de varias áreas y maestros hemos dado con la solución al dilema y la dejamos plasmada en esta publicación.

Solución:

Hago esto usando otro contenedor docker cuyo único propósito es sembrar mongo y luego salir. Sospecho que esta es la misma idea que la de ebaxt, pero cuando estaba buscando una respuesta a esto, solo quería ver un ejemplo rápido y sucio, pero directo. Así que aquí está el mío:

docker-compose.yml

mongodb:
  image: mongo
  ports:
    - "27017:27017"

mongo-seed:
  build: ./mongo-seed
  links:
    - mongodb

# my webserver which uses mongo (not shown in example)
webserver:
  build: ./webserver
  ports:
    - "80:80"
  links:
    - mongodb

mongo-seed/Dockerfile

FROM mongo

COPY init.json /init.json
CMD mongoimport --host mongodb --db reach-engine --collection MyDummyCollection --type json --file /init.json --jsonArray

mongo-seed/init.json

[
  
    "name": "Joe Smith",
    "email": "[email protected]",
    "age": 40,
    "admin": false
  ,
  
    "name": "Jen Ford",
    "email": "[email protected]",
    "age": 45,
    "admin": true
  
]

He encontrado útil usar imágenes personalizadas de Docker y usar volúmenes, en lugar de crear otro contenedor para sembrar.

Estructura de archivos

.
├── docker-compose.yml
├── mongo
│   ├── data
│   ├── Dockerfile
│   └── init-db.d
│       └── seed.js

Cada ubicación de archivo mencionada en Dockerfile/docker-compose.ymles relativo a la ubicación de docker-compose.yml

DOCKERFILE

FROM mongo:3.6

COPY ./init-db.d/seed.js /docker-entrypoint-initdb.d

docker-compose.yml

version: '3'

services:
  db:
    build: ./mongo
    restart: always
    volumes:
      - ./mongo/data:/data/db #Helps to store MongoDB data in `./mongo/data`
    environment:
      MONGO_INITDB_ROOT_USERNAME: USERNAME
      MONGO_INITDB_ROOT_PASSWORD: PWD
      MONGO_INITDB_DATABASE: DBNAME

semilla.js

// Since Seeding in Mongo is done in alphabetical order... It's is important to keep
// file names alphabetically ordered, if multiple files are to be run.

db.test.drop();
db.test.insertMany([
  
    _id: 1,
    name: 'Tensor',
    age: 6
  ,
  
    _id: 2,
    name: 'Flow',
    age: 10
  
])

docker-entrypoint-initdb.d se puede usar para crear diferentes usuarios y cosas relacionadas con la administración de mongodb, solo cree un js-script ordenado alfabéticamente para createUser etc…

Para obtener más detalles sobre cómo personalizar el servicio MongoDB Docker, lea esto

Además, es bueno mantener sus contraseñas y nombres de usuario seguros de Public, NO presione credenciales en git público, en su lugar, use Docker Secrets. Lea también este Tutorial sobre Secretos

Tenga en cuenta que no es necesario entrar en modo docker-swarm usar secretos. Compose Files también admite secretos. Mira esto

Los secretos también se pueden usar en MongoDB Docker Services

Respuesta actual basada en la respuesta de @Jeff Fairley y actualizada de acuerdo con los nuevos documentos de Docker

docker-compose.yml

version: "3.5"

services:
  mongo:
    container_name: mongo_dev
    image: mongo:latest
    ports:
      - 27017:27017
    networks:
      - dev

  mongo_seed:
    container_name: mongo_seed
    build: .
    networks:
      - dev
    depends_on:
      - mongo

networks:
  dev:
    name: dev
    driver: bridge

Dockerfile

FROM mongo:latest
COPY elements.json /elements.json
CMD mongoimport --host mongo --db mendeleev --collection elements --drop --file /elements.json --jsonArray

Probablemente necesite reconstruir las imágenes actuales.

Comentarios y calificaciones del tutorial

Si para ti ha sido útil este artículo, sería de mucha ayuda si lo compartieras con otros desarrolladores y nos ayudes a extender nuestro contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *