如何使用默认的集合和数据创build一个Mongo Docker镜像?

我需要支持在这里build立我自己的mongo泊坞窗图像。

我有一个脚本列表来创build和插入数据到MongoDB,这将在我的Dockerfile中调用,以提供一个默认的集合和数据的docker图像。

下面是我的Dockerfile当前的样子:

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 

我已经尝试了不同的选项来启动和停止mongod,并且总是失败之一,当前脚本会引发以下错误:

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

更新

@Matt答案后,我可以成功运行的命令链,但仍然看不到我的数据库(称为my-db),收集和数据。

目前的Dockerfile:

 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 

docker build命令的输出:

 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 

但正如我所说的,我仍然无法使用mongo shell来查看数据库中的数据库,集合和数据。 另外我连接到正在运行的容器,并得到了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 

我也检查了文件夹/ 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 

可能会帮助:

  • 父Dockerfile
  • 父Dockerfile ENTRYPOINT

问题是信息不能保存在/db/data ,所以我创build了一个创build我自己的数据目录的解决scheme。

 # 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"] 

感谢docker -library / mongo Github项目中的@yosifkit,指出卷会将数据存储在生成的图像中。 我错过了文档。

在Docker镜像构build期间,每个构build命令(如RUN都会在其自己的Docker容器中启动,然后在命令完成时将数据提交为镜像。 如果在构build时运行dockviz images --tree ,则会得到这个想法。

在你的情况下, mongod在你需要之前已经开始并停止了很久。 您需要启动mongo并在一个RUN步骤中运行所有脚本。 您可以通过使用启动mongod并插入数据的shell脚本来实现此目的。

您的Dockerfile将运行:

 RUN mongo_create_insert.sh 

那么mongo_create_insert.sh包含你所有的与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 

作为一个方面说明,我倾向于在我的基础镜像中安装Ansible,并使用它在单个RUN命令中configurationDocker镜像,而不是在Dockerfile中执行大量的shell运行步骤(最后只是一个美化的shell脚本)。 你失去了一些构buildcaching的好处,但是我们已经从使用shell脚本进行configuration开始,这是有原因的。