docker集装箱内的种子mongodb

我知道有一些伎俩像使用一个单独的容器来播种真实的容器,就像在这个答案中一样 。 我喜欢这种方法,但是我想知道一旦容器启动,我是否可以做到这一点。 简单地创build一个Dockerfile。 以前面的答案为出发点,我尝试了各种解决scheme,这是一个:

FROM mongo:3.0.15 COPY ./init.json /init.json CMD (mongod &) && (sleep 70 && mongoimport -v --db reach-engine --collection MyDummyCollection --type json --file /init.json --jsonArray) EXPOSE 27017 

唉这个解决scheme它不是优雅的,也不是工作原因:因为mongod在后台,尽快mongoimport完成容器停止,所以即使导入成功完全unusefull。

首先, 睡眠70是非常糟糕的,因为如果mongod需要超过70秒的时间,会不会发生什么情况。

想法?

我总是喜欢单独的容器方法,但这并不意味着这是不可能的。 你的问题是,你在后台启动mongod,然后运行脚本。 你应该在后台运行脚本,然后启动mongod作为主进程。

有一个很好的shell脚本在https://github.com/vishnubob/wait-for-it ,它可以为你做所有等待的部分。 但是你需要netcat

所以这里是一个更新的Dockerfile

Dockerfile

 FROM mongo:3.0.15 RUN apt-get update -y && apt-get install -y netcat && apt-get clean COPY ./init.json /init.json COPY ./init.sh /init.sh ADD https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh /wait-for-it.sh RUN chmod +x /init.sh /wait-for-it.sh CMD /init.sh EXPOSE 27017 

init.sh

 #!/bin/sh bash -c "/wait-for-it.sh 127.0.0.1:3306 -t 120 -- mongoimport -v --db reach-engine --collection MyDummyCollection --type json --file /init.json" & exec mongod 

现在当你运行容器时,你会看到下面的输出

 2017-08-29T11:54:33.357+0000 I NETWORK [initandlisten] waiting for connections on port 27017 2017-08-29T11:54:34.286+0000 I NETWORK [initandlisten] connection accepted from 127.0.0.1:33070 #1 (1 connection now open) 2017-08-29T11:54:34.287+0000 I NETWORK [conn1] end connection 127.0.0.1:33070 (0 connections now open) wait-for-it.sh: 127.0.0.1:27017 is available after 1 seconds 2017-08-29T11:54:34.295+0000 filesize: 556 bytes 2017-08-29T11:54:34.295+0000 using fields: 2017-08-29T11:54:34.296+0000 I NETWORK [initandlisten] connection accepted from 127.0.0.1:33072 #2 (1 connection now open) 2017-08-29T11:54:34.297+0000 connected to: localhost 2017-08-29T11:54:34.297+0000 ns: reach-engine.MyDummyCollection 2017-08-29T11:54:34.297+0000 connected to node type: standalone 2017-08-29T11:54:34.297+0000 using write concern: w='1', j=false, fsync=false, wtimeout=0 2017-08-29T11:54:34.297+0000 using write concern: w='1', j=false, fsync=false, wtimeout=0 2017-08-29T11:54:34.298+0000 I INDEX [conn2] allocating new ns file /data/db/reach-engine.ns, filling with zeroes... 2017-08-29T11:54:34.338+0000 I STORAGE [FileAllocator] allocating new datafile /data/db/reach-engine.0, filling with zeroes... 2017-08-29T11:54:34.340+0000 I STORAGE [FileAllocator] done allocating datafile /data/db/reach-engine.0, size: 64MB, took 0.001 secs 2017-08-29T11:54:34.342+0000 imported 4 documents 2017-08-29T11:54:34.342+0000 I NETWORK [conn2] end connection 127.0.0.1:33072 (0 connections now open) 

正如你所看到的,服务器起床和logging插入之间没有1秒的延迟