¿Cómo puedo semilla de un mongo base de datos mediante la ventana acoplable-componer?

Estoy tratando de distribuir un conjunto de aplicaciones que se ejecutan en varios contenedores vinculados que incluye una base de datos mongo que se requiere para:

  • ser distribuida que contiene algunos datos de semillas;
  • permiten a los usuarios agregar datos adicionales.

Idealmente, los datos también se conserva en un linked data volumen del contenedor.

Puedo obtener los datos en el mongo contenedor mediante un mongo instancia de la base de que no monta ningún volúmenes (dockerhub de imagen: psychemedia/mongo_nomount – esta es esencialmente la base de mongo Dockerfile sin la VOLUME /data/db declaración) y un Dockerfile de configuración a lo largo de las líneas de:

ADD . /files
WORKDIR /files
RUN mkdir -p /data/db && mongod --fork --logpath=/tmp/mongodb.log && sleep 20 && \
mongoimport  --db testdb --collection testcoll  --type csv --headerline --file ./testdata.csv  #&& mongod --shutdown

donde ./testdata.csv está en el mismo directorio (./mongo-with-data) como el Dockerfile.

Mi ventana acoplable-componer archivo de configuración incluye los siguientes:

mongo:
  #image: mongo
  build: ./mongo-with-data
  ports:
    - "27017:27017"
  #Ideally we should be able to mount this against a host directory
  #volumes:
  #  - ./db/mongo/:/data/db
  #volumes_from:
  #  - devmongodata

#devmongodata:
#    command: echo created
#    image: busybox
#    volumes: 
#       - /data/db

Siempre que se intenta montar un VOLUMEN parece como si el original cabeza de serie de datos que se almacena en /data/db – se ha borrado. Supongo que cuando el volumen está montado para /data/db sustituye a lo que existe actualmente.

Que dijo, el ventana acoplable userguide sugiere que: Volúmenes se inicializan cuando un contenedor es creado. Si el contenedor de la imagen de base de datos contiene los datos en el punto de montaje especificado, que los datos existentes se copian en el nuevo volumen sobre volumen de inicialización? Así que espera que los datos persistan si puse el comando de VOLUMEN después de la siembra RUN comando?

Entonces, ¿qué estoy haciendo mal?

La visión a largo plazo es que quiero automatizar la compilación de varios contenedores vinculados, y luego distribuir un Vagrantfile/ventana acoplable-componer archivo YAML que el fuego de un conjunto vinculado de aplicaciones, que incluye un pre-sembradas mongo base de datos con un (parcialmente pre-pobladas) persistente contenedor de datos.

  • Supongo que lo que quiero hacer en la fase de construcción de montaje de la base de datos del contenedor en un nuevo volumen de datos recipiente, de tal manera que los datos en la base de datos del directorio de contenedor se coloca en el volumen de datos, en lugar de montar el volumen de datos contenedor en el db contenedor, que sobrescribe los datos que acaba de importar.
  • Después de haber establecido un volumen de datos contenedor con un principio cabezas de serie de datos, puedo destruir el contenedor de base de datos y, a continuación, sólo tiene que conectar un sencillo de mongodb contenedor para los datos de volumen de recipiente para su utilización por un usuario final. El corazón de la pregunta original, ahora es esta: ¿cuál es la manera más fácil de crear y rellenar un volumen de datos contenedor que un mongod contenedor, se puede conectar?
  • Con Rails yo uso docker-compose run container_name rake db:seed
  • Si está usando docker-componer no es un requisito, usted podría crear un derivado de mongo imagen que configura la base de datos, incluyendo datos de semillas, en la inicialización. Este solución funciona bien para mí.
InformationsquelleAutor psychemedia | 2015-07-03

8 Kommentare

  1. 85

    Puedo hacer esto usando otra ventana acoplable contenedor cuyo único propósito es la semilla de mongo, luego salir. Sospecho que esta es la misma idea como ebaxt‘s, pero cuando yo estaba buscando una respuesta a esto, yo sólo quería ver una rápida y sucia, pero sencilla, por ejemplo. Así que aquí está la mía:

    ventana acoplable-componer.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-semilla/Dockerfile

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

    mongo-semilla/init.json

    [
      {
        "name": "Joe Smith",
        "email": "[email protected]",
        "age": 40,
        "admin": false
      },
      {
        "name": "Jen Ford",
        "email": "[email protected]",
        "age": 45,
        "admin": true
      }
    ]
    • ¿Cuáles son los pros & contras de la utilización de un externo de la ventana acoplable a la semilla?
    • Yo prefiero mantener las cosas separadas y simple, y he encontrado que generalmente me presta la mayor flexibilidad… Por ejemplo… si quiero cambiar algo en mi archivo de semillas, voy a tener que construirlo de nuevo. Si mi semilla eran la misma imagen de mi carrera mongo ejemplo, voy a perder mi mongo de datos debido a que el restablecimiento. Obviamente, yo podría exportar e importar, pero eso es más trabajo.
    • Ejecutar el formulario anterior usando mongorestore parece dar un exited with code 0 error?
    • Hizo pasar a ejecutar en problemas donde se siembra tu DB varias veces en diferentes carreras ?
    • en realidad he visto que. Nunca me hizo averiguar por qué sucede, sin embargo. Mi archivo semilla crea incluso una única restricción que debe ser violada por los datos importados por segunda vez, sin embargo, los datos todavía sigue en… Es un rascador de cabeza.
    • He intentado la solución de cambiar el comando para mongorestore --host=127.0.0.1 -d rigel_db /dump/rigel_db/ y que los rendimientos de Failed: error connecting to db server: no reachable servers. ¿Sabes si hay algo diferente con mongorestore?
    • Camilo: El problema puede ser que la base de datos en mongodb contenedor no se ha iniciado completamente cuando mongo-semilla se inicia. Yo pondría un «depends_on: mongodb» en el mongo-semilla de configuración. Sin embargo, de que solo espere a que la mongodb contenedor para empezar, no de la base de datos real en su interior. Un «restart: en el fallo» comando en el mongo-semilla config va a hacer es intentarlo de nuevo si la base de datos no está disponible. He visto que se trate de tres o cuatro veces antes de la base de datos está disponible.
    • Estoy atascado con el webserver cosa, he tomcat se ejecuta usando una ventana acoplable ya en el puerto 8080, ¿cómo puedo apuntar a que?
    • Puede usted por favor comparta un ejemplo a punto de mongo DB URL y directamente a la ventana acoplable componer? Es posible enviar la dirección URL en lugar de Volcar?
    • estás tratando de conectar su ventana acoplable entorno externo mongo instancia? Si es así, me gustaría recomendar una nueva cuestión que está fuera del alcance de esta pregunta.
    • Si mi semilla eran la misma imagen de mi carrera mongo ejemplo, voy a perder mi mongo de datos debido a que el restablecimiento eso implica Que usted está usando docker por el camino equivocado, cuando no está montando las carpetas de datos de volumen y dejar que se escribe en la misma instancia del contenedor como mongodb propia aplicación
    • Gracias por [email protected], a los que me enfrentaba con el problema mencionado anteriormente error connecting to db server: no reachable servers. Los registros de mongo_seed contenida 0 imported docs. Pero mondodb dueño, lo puedo usar desde el sistema host como mongo --port <mycustomport> y se puede ejecutar el comando mongoimport con éxito. Podrían aclarar
    • Encuentra la solución para el coment de arriba. Las actuales medidas describir mongo semilla para la versión antigua ventana acoplable-componer. usted necesita agregar network_mode: host param para mongo_seed contenedor y cambio links en depends_on
    • podría publicar un independiente responder con más detalles? Voy a poner no accesible servidores, pero utilizando actualizado yml como lo sugieren: versión: ‘3’ servicios: mongodb: imagen: mongo puertos: – «27017:27017» mongo-semilla: compilación: ./mongo-semilla restart: en la insuficiencia network_mode: host depends_on: – mongodb
    • hecho stackoverflow.com/a/55819683/5046030

  2. 8

    He encontrado útiles para utilizar la ventana acoplable de Imágenes Personalizadas y el uso de volúmenes, en lugar de crear otro recipiente para la siembra.

    La Estructura Del Archivo De

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

    Cada ubicación del Archivo mencionado en Dockerfile/docker-compose.yml, es relativa a la ubicación de docker-compose.yml

    DOCKERFILE

    FROM mongo:3.6
    
    COPY ./init-db.d/seed.js /docker-entrypoint-initdb.d

    ventana acoplable-componer.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}}

    seed.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 puede ser utilizado para la creación de los diferentes usuarios y mongodb administración de materias relacionadas, basta con crear una alfabético ordenó nombre js-script createUser etc…

    Para obtener más detalles sobre cómo personalizar MongoDB ventana acoplable servicio, lea este

    También, es bueno para mantener sus contraseñas y nombres de usuario de seguro de Público, NO introduzca las credenciales en público git, en lugar de utilizar Ventana Acoplable Secretos. Leer también este Tutorial sobre los Secretos

    Hacer la nota, no es necesario entrar en ventana acoplable-enjambre modo el uso de secretos. Componer soporta Archivos secretos. Compruebe este

    Secretos también puede ser utilizado en MongoDB Ventana Acoplable Servicios

    • Podrían aclarar donde se toma db en db.test.drop();?
    • Compruebe por favor docs.mongodb.com/manual/tutorial/…. Usted puede crear su propio db conexión, o utilizar la conexión predeterminada proporcionada mientras se ejecuta la secuencia de comandos (que supongo que es el usuario root para init script aquí).
  3. 2

    Actual respuesta basada en la @Jeff Fairley respuesta y actualizados de acuerdo a la nueva ventana acoplable docs

    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 necesitará reconstruir imágenes actuales.

  4. 1

    Puede utilizar Mongo Siembra ventana acoplable imagen.

    ¿Por qué?

    • Tiene la ventana acoplable imagen listo para ir
    • Que no están ligados a archivos JSON – JavaScript y los Manuscritos de los archivos son compatibles (incluyendo opcional de validación del modelo, con Transcripción)

    Ejemplo de uso con ventana acoplable Componer:

    version: '3'
    services:
      database:
        image: 'mongo:3.4.10'
        ports:
        - '27017:27017'
      api:
        build: ./api/
        command: npm run dev
        volumes: 
        - ./api/src/:/app/src/
        ports:
        - '3000:3000'
        - '9229:9229'
        links:
        - database
        depends_on:
        - database
        - data_import
        environment: 
        - &dbName DB_NAME=dbname
        - &dbPort DB_PORT=27017 
        - &dbHost DB_HOST=database
      data_import:
        image: 'pkosiec/mongo-seeding:3.0.0'
        environment:
        - DROP_DATABASE=true
        - REPLACE_ID=true
        - *dbName
        - *dbPort
        - *dbHost
        volumes:
        - ./data-import/dev/:/data-import/dev/
        working_dir: /data-import/dev/data/
        links:
        - database
        depends_on:
        - database

    Descargo de responsabilidad: yo soy el autor de esta biblioteca.

    • Esto se ve a la mano, gracias. Voy a tratar de darle una oportunidad…
    • He actualizado el ejemplo de la última versión de Mongo de la Siembra. Feliz siembra!
  5. 0

    Puede utilizar este imagen que proporciona ventana acoplable contenedor para muchos puestos de trabajo ( importación, exportación , dump )

    Vistazo a la ejemplo usando docker-componer

  6. 0

    Para responder a mi propia pregunta:

    • simple archivo YAML para crear sencillos mongo contenedor vinculado a un volumen de datos contenedor, disparado por Vagrant ventana acoplable componer.
    • en el Vagrantfile, código a lo largo de las líneas de:

    config.vm.provision :shell, :inline => <<-SH
    docker exec -it -d vagrant_mongo_1 mongoimport --db a5 --collection roads --type csv --headerline --file /files/AADF-data-minor-roads.csv
    SH

    para importar los datos.

    Paquete de la caja.

    Distribuir la caja.

    Para el usuario, un simple Vagrantfile a cargar la caja y ejecutar una simple ventana acoplable-componer YAML secuencia de comandos para iniciar los contenedores y montar el mongo db en contra de los datos de volumen de recipiente.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea