2017-09-01 32 views
1

我正在尝试使用正在运行的mongodb实例创建Docker图像,该实例已经包含一些数据。所以,我把我的Dockerfile这样的:为什么Docker Mongo在图像构建期间拒绝连接

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 : 
[email protected]/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守护拒绝我的连接。

他为什么要做这样的事情?特别是当我可以从外部自由连接到数据库时。

编辑:

我试图查看是否mongod服务是由与service mongod status =>mongod:unrecognized service更换RUN命令运行在所有。所以看起来mongod服务不是runnig。这是奇怪的,因为mongo:3.4形象从我与推导两端的last statement

CMD ["mongod"] 
+0

是在docker映像中已经启动的mongod服务吗? –

+1

@GregoryNEUT它似乎不是。我相应地编辑了我的问题。 – Dachstein

回答

2

你正在建设一个码头工人的形象,蒙戈服务并不在构建阶段运行。

构建泊坞窗图像只是按顺序执行一系列命令。没有守护进程正在监听,所以你的命令无法工作。

你可能想run你的形象,对运行中的container执行你的命令,例如:

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

有了这2个命令,首先执行蒙戈容器(由instantianting蒙戈:3.4图像)然后你在正在运行的容器中执行一个命令。

1

首先,当您构建图像时,图像中没有任何东西在运行。进程只在运行映像时运行。

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 

而且将推出蒙戈的只是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())" 

的第一个命令启动背景图像和下一上运行一个额外的过程。如果进程需要时间起床,您可能需要在两者之间进行一些睡眠