我知道有一些技巧,例如使用单独的容器来播种真实容器,就像在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秒,还不清楚会发生什么。
想法?
答案 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秒的延迟