Dockerized Mongo需要很长时间才能加载然后不运行mongo

时间:2017-05-27 20:36:53

标签: mongodb docker

我尝试创建一个安装MongoDB的简单Dockerfile(使用标准的docker教程),然后运行python命令:

SCICARBINE

然后我跑了FROM ubuntu:latest RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927 RUN echo "deb http://repo.mongodb.org/apt/ubuntu $(cat /etc/lsb-release | grep DISTRIB_CODENAME | cut -d= -f2)/mongodb-org/3.2 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-3.2.list RUN apt-get update && apt-get install -y mongodb-org python python-pip RUN mkdir -p /data/db COPY ./requirements.txt /tmp/requirements.txt RUN pip install -r /tmp/requirements.txt WORKDIR /app COPY . /app EXPOSE 27017 ENTRYPOINT ["/usr/bin/mongod"] CMD python -c "print 'hello world'"

不幸的是,它完全失败了。

1)每次在进行更改后运行docker build .时,都需要AGES来构建和输出疯狂的日志记录,慢慢地重新下载并慢慢地重新安装每个包 - 完全令人难以忍受。

2)docker build .显示没有运行Mongo

3)最后的docker ps命令说它运行但不输出实际的字符串。

为什么这么复杂?

我的输出:https://pastebin.com/igyYY8v1(警告,长)

3 个答案:

答案 0 :(得分:0)

您的Dockerfile错误。

了解CMD和ENTRYPOINT如何互动: https://docs.docker.com/engine/reference/builder/#understand-how-cmd-and-entrypoint-interact

我的建议是为数据库使用容器,为Python App使用另一个容器。

答案 1 :(得分:0)

Docker方式是分成2个容器,1个用于app,1个用于mongo。

尝试将容器视为隔离进程而不是小型虚拟机。并且认为有很多软件可以运行docker图像,如下所示的mongo和python。 你会注意到我没有自己安装任何东西。

使用docker-compose

尝试此操作

<强> Dockerfile

FROM python

COPY ./requirements.txt /tmp/requirements.txt
RUN pip install -r /tmp/requirements.txt

WORKDIR /app
COPY app.py /app

EXPOSE 27017

CMD python app.py

<强>搬运工-compose.yml

version: "3"

services:
  app:
    build: .
    links:
      - mongo
  mongo:
    image: mongo:3.2

<强> app.py

print("hello world")
print("bye")

运行它:

docker-compose up --build

使用docker-compose运行,您可以从python应用程序中指向mongo:mongo:27017

PS:关于你的提示,你需要了解ENTRYPOINT和CMD的工作原理:

ENTRYPOINT ["/usr/bin/mongod"]

CMD python -c "print 'hello world'"

告诉docker运行此单个命令来启动容器:

`/usr/bin/mongod python -c "print 'hello world'"`. 

正如你所看到的那样毫无意义。 ENTRYPOINT和CMD是一种连接。

答案 2 :(得分:0)

当您更改Dockerfile中的操作时,根据这些更改的位置,它不能再使用先前缓存的层进行构建。因此,如果您更改RUN步骤,则在重建时必须重做所有后续RUN步骤。

此外,当使用ENTRYPOINTCMD时,CMD字符串将附加到ENTRYPOINT,生成容器的命令字符串。< / p>

基本上,您的配置将尝试执行以下操作:

/usr/bin/mongod python -c "print 'hello world'

而不是将其拆分为单独的命令。

您真的希望将其拆分为两个不同的容器,一个包含您的python应用程序,另一个包含您的数据库。然后,您可以组建一个网络供他们进行通信。