Bash 将mongodb种子放入docker容器中

Bash 将mongodb种子放入docker容器中,bash,mongodb,docker,Bash,Mongodb,Docker,我知道有一些技巧,比如使用一个单独的容器来播种真正的容器,就像在中一样。我喜欢这种方法,但我想知道我是否能在容器启动时就这样做。只需创建一个Dockerfile。以前面的答案为出发点,我尝试了各种解决方案,这是一个: FROM mongo:3.0.15 COPY ./init.json /init.json CMD (mongod &) && (sleep 70 && mongoimport -v --db reach-engine --collect

我知道有一些技巧,比如使用一个单独的容器来播种真正的容器,就像在中一样。我喜欢这种方法,但我想知道我是否能在容器启动时就这样做。只需创建一个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秒会发生什么


想法

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

有一个很好的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秒的延迟

您需要使用docker compose,我不会。我愿意在一个Dockerfile中做任何事情(如果可能的话)!很明显,如果
mongod
启动时间超过70秒会发生什么情况-
mongoimport
将在没有人监听端口时放弃尝试连接到db。您可以选择的一个选项是:在启动mongod之前,数据库文件的纯旧
cp
mongoimport
it一次,停止数据库,将文件复制到主机,将
copy
添加到dockerfile。除非您经常更改
init.json