为什么Docker Mongo在图像构build期间拒绝连接

我正在尝试使用正在运行的mongodb实例创build一个Docker镜像,该实例将包含一些数据。 所以我做这样的Dockerfile

 FROM mongo:3.4 RUN mongo --eval "printjson(db.serverStatus())" 

我马上得到这个错误:

 Sending build context to Docker daemon 7.168kB Step 1/3 : FROM mongo:3.4 ---> b39de1d79a53 Step 2/3 : RUN mongo --eval "printjson(db.serverStatus())" ---> Running in 778f00a25623 MongoDB shell version v3.4.7 connecting to: mongodb://127.0.0.1:27017 2017-09-01T13:42:23.128+0000 W NETWORK [thread1] Failed to connect to 127.0.0.1:27017, in(checking socket for error after poll), reason: Connection refused 2017-09-01T13:42:23.128+0000 E QUERY [thread1] Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed : connect@src/mongo/shell/mongo.js:237:13 @(connect):1:6 exception: connect failed The command '/bin/sh -c mongo --eval "printjson(db.serverStatus())"' returned a non-zero code: 1 

也就是说, mongod守护进程拒绝了我的连接。

他为什么要这样做? 尤其是当我可以从外部自由连接到数据库。

编辑:

我尝试通过用service mongod status => mongod:unrecognized servicereplaceRUN命令来查看是否正在运行mongod:unrecognized service 。 所以看起来mongod服务不是runnig。 自从mongo:3.4的最后一个声明以来,这是很奇怪的mongo:3.4我从中得出的结论是:

 CMD ["mongod"] 

您正在构buildDocker镜像,在构build阶段,mongo服务根本不运行。

构buildDocker镜像只是按顺序执行一系列命令。 没有守护进程监听,所以你的命令不能工作。

您可能想要run您的映像并在正在运行的container上执行您的命令,例如:

 docker run -d --name=my-name mongo:3.4 docker exec -ti my-name mongo --eval "printjson(db.serverStatus())" 

使用这2个命令,首先执行一个mongo容器(通过实例化mongo:3.4映像),然后在运行的容器中执行一个命令。

首先,当你build立图像时,图像中没有任何东西在运行。 进程只在运行映像时运行。

 FROM mongo:3.4 RUN mongo --eval "printjson(db.serverStatus())" 

每个RUN语句都在没有其他任何运行的新shell中执行。 所以如果你需要运行一些东西来检查,你需要自己运行它,它只能用于当前的语句

 RUN mongod & ; echo "Waiting for mongo to be up"; sleep 20; mongo --eval "printjson(db.serverStatus())"; pkill mongod 

这将启动mongo只是RUN一步,如果你添加另一个声明之后

 RUN mongo --eval "printjson(db.serverStatus())" 

这是行不通的。 新的shell,从旧的运行语句没有进程。 当前目录重置为任何WORKDIR

运行映像时只能执行命令。 所以你会使用下面的东西

 docker run --name mongoserver -d mongo:3.4 docker exec mongoserver mongo --eval "printjson(db.serverStatus())" 

第一个命令在后台启动映像,而下一个命令运行一个附加进程。 如果这个过程需要时间来起床,你可能需要在两者之间进行一些睡眠