tutorial hub deploy compose mongodb docker dockerfile

hub - docker mongodb tutorial



¿Cómo crear una imagen de Mongo Docker con colecciones y datos predeterminados? (2)

Durante la compilación de una imagen acoplable, cada comando de compilación, como RUN se inicia en su propio contenedor acoplable y luego, cuando el comando finaliza, los datos se confirman como una imagen. Si ejecuta dockviz images --tree mientras hace una compilación, obtendrá la idea.

En su caso, mongod comenzó y se detuvo mucho antes de que usted lo necesite. Debes iniciar mongo y ejecutar tus scripts todo en el único paso RUN . Puede lograrlo utilizando un script de shell que inicie mongod e inserte sus datos.

Su Dockerfile se ejecutará:

RUN mongo_create_insert.sh

Entonces mongo_create_insert.sh contiene todos sus pasos dependientes de mongo:

#!/usr/bin/env bash mongod --fork --logpath /var/log/mongodb.log --dbpath /data/db/ FILES=scripts/*-create.js for f in $FILES; do mongo mydb $f; done FILES=scripts/*-insert.js for f in $FILES; do mongo mydb $f; done mongod --shutdown

Como nota al margen, tiendo a instalar Ansible en mi imagen base y lo uso para aprovisionar imágenes Docker en un solo comando RUN lugar de hacer muchos pasos de RUN de shell en un Dockerfile (que al final es solo un guión de shell glorificado). Se pierde parte de la bondad del almacenamiento en caché de compilación, pero hemos pasado del aprovisionamiento con scripts de shell por algún motivo.

Necesito ayuda aquí para construir mi propia imagen de mongo docker.

Tengo una lista de scripts para crear e insertar datos en el MongoDB que se llamarán en mi archivo Docker para entregar una imagen de portador con colecciones y datos predeterminados.

Así es como se ve mi archivo Dockerfile actualmente:

FROM mongo:latest RUN mkdir -p /data/scripts COPY . /data/scripts RUN mongod --fork --logpath /var/log/mongodb.log --dbpath /data/db/ RUN FILES=scripts/*-create.js RUN for f in $FILES; do mongo mydb $f; done RUN FILES=scripts/*-insert.js RUN for f in $FILES; do mongo mydb $f; done RUN mongod --shutdown

He intentado diferentes opciones para iniciar y detener mongod y siempre falla uno de los dos, el script actual genera el siguiente error:

There doesn''t seem to be a server running with dbpath: /data/db

Actualizar

Después de la respuesta de @Matt, pude ejecutar con éxito la cadena de comandos, pero aún no puedo ver mi base de datos (llamada my-db), las colecciones y los datos allí.

El archivo Docker actual:

FROM mongo:latest RUN mkdir -p /data/db/scripts COPY . /data/db RUN mongod --fork --logpath /var/log/mongodb.log --dbpath /data/db / && CREATE_FILES=/data/db/scripts/*-create.js / && for f in $CREATE_FILES; do mongo 127.0.0.1:27017 $f; done / && INSERT_FILES=/data/db/scripts/*-insert.js / && for f in $INSERT_FILES; do mongo 127.0.0.1:27017 $f; done / && mongod --shutdown

El resultado del comando de compilación de Docker:

Sending build context to Docker daemon 10.24 kB Step 1 : FROM mongo:latest ---> c08c92f4cb13 Step 2 : RUN mkdir -p /data/db/scripts ---> Running in a7088943bb57 ---> 373c7319927d Removing intermediate container a7088943bb57 Step 3 : COPY . /data/db ---> 8fa84884edb7 Removing intermediate container ae43e2c24fee Step 4 : RUN mongod --fork --logpath /var/log/mongodb.log --dbpath /data/db && CREATE_FILES=/data/db/scripts/*-create.js && for f in $CREATE_FILES; do mongo 127.0.0.1:27017 $f; done && INSERT_FILES=/data/db/scripts/*-insert.js && for f in $INSERT_FILES; do mongo 127.0.0.1:27017 $f; done && mongod --shutdown ---> Running in 33970b6865ee about to fork child process, waiting until server is ready for connections. forked process: 10 child process started successfully, parent exiting MongoDB shell version: 3.0.7 connecting to: 127.0.0.1:27017/test MongoDB shell version: 3.0.7 connecting to: 127.0.0.1:27017/test killing process with pid: 10 ---> 8451e43b7749 Removing intermediate container 33970b6865ee Successfully built 8451e43b7749

Pero como dije, todavía no puedo ver la base de datos, las colecciones y los datos en mi base de datos usando mongo shell. También me conecté al contenedor en ejecución y obtuve el mongodb.log:

2015-11-06T16:15:14.562+0000 I JOURNAL [initandlisten] journal dir=/data/db/journal 2015-11-06T16:15:14.562+0000 I JOURNAL [initandlisten] recover : no journal files present, no recovery needed 2015-11-06T16:15:14.698+0000 I JOURNAL [initandlisten] preallocateIsFaster=true 2.36 2015-11-06T16:15:14.746+0000 I JOURNAL [durability] Durability thread started 2015-11-06T16:15:14.746+0000 I JOURNAL [journal writer] Journal writer thread started 2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] MongoDB starting : pid=10 port=27017 dbpath=/data/db 64-bit host=9c05d483673a 2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended. 2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] 2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] 2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is ''always''. 2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] ** We suggest setting it to ''never'' 2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] 2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is ''always''. 2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] ** We suggest setting it to ''never'' 2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] 2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] db version v3.0.7 2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] git version: 6ce7cbe8c6b899552dadd907604559806aa2e9bd 2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] build info: Linux ip-10-183-78-195 3.2.0-4-amd64 #1 SMP Debian 3.2.46-1 x86_64 BOOST_LIB_VERSION=1_49 2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] allocator: tcmalloc 2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] options: { processManagement: { fork: true }, storage: { dbPath: "/data/db" }, systemLog: { destination: "file", path: "/var/log/mongodb.log" } } 2015-11-06T16:15:14.748+0000 I INDEX [initandlisten] allocating new ns file /data/db/local.ns, filling with zeroes... 2015-11-06T16:15:14.802+0000 I STORAGE [FileAllocator] allocating new datafile /data/db/local.0, filling with zeroes... 2015-11-06T16:15:14.802+0000 I STORAGE [FileAllocator] creating directory /data/db/_tmp 2015-11-06T16:15:14.804+0000 I STORAGE [FileAllocator] done allocating datafile /data/db/local.0, size: 64MB, took 0 secs 2015-11-06T16:15:14.807+0000 I NETWORK [initandlisten] waiting for connections on port 27017 2015-11-06T16:15:14.830+0000 I NETWORK [initandlisten] connection accepted from 127.0.0.1:49641 #1 (1 connection now open) 2015-11-06T16:15:14.832+0000 I INDEX [conn1] allocating new ns file /data/db/my-db.ns, filling with zeroes... 2015-11-06T16:15:14.897+0000 I STORAGE [FileAllocator] allocating new datafile /data/db/my-db.0, filling with zeroes... 2015-11-06T16:15:14.898+0000 I STORAGE [FileAllocator] done allocating datafile /data/db/my-db.0, size: 64MB, took 0 secs 2015-11-06T16:15:14.904+0000 I NETWORK [conn1] end connection 127.0.0.1:49641 (0 connections now open) 2015-11-06T16:15:14.945+0000 I NETWORK [initandlisten] connection accepted from 127.0.0.1:49642 #2 (1 connection now open) 2015-11-06T16:15:14.958+0000 I NETWORK [conn2] end connection 127.0.0.1:49642 (0 connections now open) 2015-11-06T16:15:14.982+0000 I CONTROL [signalProcessingThread] got signal 15 (Terminated), will terminate after current cmd ends 2015-11-06T16:15:14.982+0000 I CONTROL [signalProcessingThread] now exiting 2015-11-06T16:15:14.982+0000 I NETWORK [signalProcessingThread] shutdown: going to close listening sockets... 2015-11-06T16:15:14.982+0000 I NETWORK [signalProcessingThread] closing listening socket: 6 2015-11-06T16:15:14.982+0000 I NETWORK [signalProcessingThread] closing listening socket: 7 2015-11-06T16:15:14.982+0000 I NETWORK [signalProcessingThread] removing socket file: /tmp/mongodb-27017.sock 2015-11-06T16:15:14.982+0000 I NETWORK [signalProcessingThread] shutdown: going to flush diaglog... 2015-11-06T16:15:14.982+0000 I NETWORK [signalProcessingThread] shutdown: going to close sockets... 2015-11-06T16:15:14.982+0000 I STORAGE [signalProcessingThread] shutdown: waiting for fs preallocator... 2015-11-06T16:15:14.982+0000 I STORAGE [signalProcessingThread] shutdown: final commit... 2015-11-06T16:15:15.008+0000 I JOURNAL [signalProcessingThread] journalCleanup... 2015-11-06T16:15:15.008+0000 I JOURNAL [signalProcessingThread] removeJournalFiles 2015-11-06T16:15:15.009+0000 I JOURNAL [signalProcessingThread] Terminating durability thread ... 2015-11-06T16:15:15.088+0000 I JOURNAL [journal writer] Journal writer thread stopped 2015-11-06T16:15:15.088+0000 I JOURNAL [durability] Durability thread stopped 2015-11-06T16:15:15.088+0000 I STORAGE [signalProcessingThread] shutdown: closing all files... 2015-11-06T16:15:15.090+0000 I STORAGE [signalProcessingThread] closeAllFiles() finished 2015-11-06T16:15:15.090+0000 I STORAGE [signalProcessingThread] shutdown: removing fs lock... 2015-11-06T16:15:15.090+0000 I CONTROL [signalProcessingThread] dbexit: rc: 0

También verifiqué el contenido de la carpeta / data / db:

root@fbaf17233182:/data/db# ls -al total 16 drwxr-xr-x 3 mongodb mongodb 4096 Nov 6 16:15 . drwxr-xr-x 4 root root 4096 Nov 6 16:15 .. drwxr-xr-x 2 root root 4096 Nov 5 18:55 scripts

Puede ayudar:


El problema era que la información no se podía guardar en /db/data , así que creé una solución para crear mi propio directorio de datos.

# Parent Dockerfile https://github.com/docker-library/mongo/blob/982328582c74dd2f0a9c8c77b84006f291f974c3/3.0/Dockerfile FROM mongo:latest # Modify child mongo to use /data/db2 as dbpath (because /data/db wont persist the build) RUN mkdir -p /data/db2 / && echo "dbpath = /data/db2" > /etc/mongodb.conf / && chown -R mongodb:mongodb /data/db2 COPY . /data/db2 RUN mongod --fork --logpath /var/log/mongodb.log --dbpath /data/db2 --smallfiles / && CREATE_FILES=/data/db2/scripts/*-create.js / && for f in $CREATE_FILES; do mongo 127.0.0.1:27017 $f; done / && INSERT_FILES=/data/db2/scripts/*-insert.js / && for f in $INSERT_FILES; do mongo 127.0.0.1:27017 $f; done / && mongod --dbpath /data/db2 --shutdown / && chown -R mongodb /data/db2 # Make the new dir a VOLUME to persists it VOLUME /data/db2 CMD ["mongod", "--config", "/etc/mongodb.conf", "--smallfiles"]

Gracias a @yosifkit del proyecto docker-library/mongo Github para señalar que el volumen almacenaría los datos en la imagen resultante. Me perdí eso en la documentación.