在docker中运行mongo DB命令时连接被拒绝

我是新来的docker和mongoDB,所以我希望我错过了一些步骤。 这是我到目前为止在我的Dockerfile中所拥有的:

FROM python:2.7 RUN apt-get update \ && apt-get install -y mongodb \ && rm -rf /var/lib/apt/lists/* RUN mkdir -p /data/db RUN service mongodb start RUN mongod --fork --logpath /var/log/mongodb.log RUN mongo db --eval 'db.createUser({user:"dbuser",pwd:"dbpass",roles:["readWrite","dbAdmin"]})' 

连接失败的最后一个命令:

错误:无法连接到src / mongo / shell / mongo.js的服务器127.0.0.1:27017:145例外:连接失败。

我怎样才能连接成功? 我应该改变主机/ IP,以及在哪些命令?

有几件事情在这里出错。 首先是你正在运行的命令:

 RUN service mongodb start RUN mongod --fork --logpath /var/log/mongodb.log 

这些将运行在docker中创build一个图层。 一旦正在运行的命令返回,启动的临时容器将被停止,并且容器中的所有文件都被捕获以创build一个新层。 这些命令之间没有持续的进程。

这些命令也运行启动命令的后台版本。 在Docker中,你会发现这是有问题的,因为当你使用这个命令作为容器的命令时,你会发现一旦命令完成,容器就会死亡。 容器上的Pid 1与linux操作系统上的pid 1具有相同的作用,一旦它死了,所有其他事情也一样。

我看到的第二个问题是混合数据与你的容器的forms,初始化数据库与最后一个运行命令。 这是因为没有数据库运行(见上面)。 我build议你做一个configuration数据库的入口点,如果数据库不存在,然后在你的docker-compose.yml或docker docker run命令行中使用一个卷来在容器之间保存数据。

如果您绝对必须将数据初始化为图像的一部分,则可以尝试将各种命令合并为一次运行:

 RUN mongod --fork --logpath /var/log/mongodb.log \ && mongo db --eval 'db.createUser({user:"dbuser",pwd:"dbpass",roles:["readWrite","dbAdmin"]})' 

我想你误解了Dockerfiles的用途。 正如Dockerfile参考指出的那样,a

Dockerfile是一个文本文档,其中包含用户可以在命令行上调用以组装图像的所有命令。

图像的整个概念是从中获取正在运行的容器,然后填充数据并查询(在数据库的情况下)或者正在由外部容器/主机(在web服务的情况下)调用或许多其他可能用法。

回答你的问题,我会假设:

  1. 你想使用mongo数据库来存储数据。

  2. 你有一些pyhton代码需要访问mongo。

  3. 你想在你的数据库中的一些初始数据。

要做到这一点:

  1. 运行一个mongo数据库

    docker run --name my-mongo -d mongo

    注意:不需要编写自定义图像。 使用官方的mongo图片!

  2. 创build一个包含脚本的Python图像

    a)编写你的Dockerfile

     FROM python:3-alpine ADD my_script.py / RUN pip install any-dependency-you-might-need CMD [ "python", "./my_script.py" ] 

    b)写你的my_script.py

在这里插入你的应用程序 它将在python容器中执行。 因为mongo会被链接,你可以使用s.th. 像client = MongoClient('mongodb://mongo:27017/')开始。

  1. 运行你的Python容器与mongo的链接

    a)构build它:

     docker build -t my-pyhthon-magic . 

    b)运行它:

     docker run -d --name python-magic-container --link my-mongo:mongo my-python-magic 

    注意:这里的--link链接一个名为my-mongo的正在运行的容器,在my-python-magic -container中作为mongo在内部到达。 这就是为什么你可以在你的Python脚本中使用它。

我希望这对你有所帮助 – 如果我误解了你的话,请不要犹豫,询问或修改你的问题。