种子mongodb在码头工人容器里面

时间:2017-08-29 09:50:49

标签: bash mongodb docker

我知道有一些技巧,例如使用单独的容器来播种真实容器,就像在this answer中一样。我喜欢这种方法,但我想知道我是否可以在容器启动后立即执行此操作。只需创建一个Dockerfile。使用以前的答案作为起点我尝试了各种解决方案,这是一个:

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

这个解决方案不是很优雅,也不是工作原因:因为mongod处于后台,所以很快mongoimport完成容器停止,所以即使导入成功,它也会完全无法使用。

首先:睡眠70 非常糟糕,因为如果mongod花费的时间超过70秒,还不清楚会发生什么。

想法?

1 个答案:

答案 0 :(得分:1)

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

https://github.com/vishnubob/wait-for-it有一个很好的shell脚本,可以为你做所有的等待。但是你需要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)

正如您所看到的,服务器启动和插入记录之间甚至没有1秒的延迟