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

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

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'" 

然后我跑docker build .

不幸的是,这是一个完全失败。

1)每次运行docker build . 在做出改变之后,需要AGES来build立和输出疯狂的日志logging,慢慢地重新下载,并且慢慢地重新安装每个软件包 – 这完全令人难以忍受。

2) docker ps显示没有Mongo正在运行

3)最后, python -c "print 'hello world'命令会运行,但不会输出实际的string。

为什么这么复杂?

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

你的Dockerfile是错误的。

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

我特别的build议是使用一个容器的数据库和另一个Python应用程序。

当您更改Dockerfile中的内容时,取决于这些更改的位置,它不能再使用以前caching的图层进行构build。 所以如果你改变一个RUN步骤,所有以后的RUN步骤在重build时都必须重做。

此外,当使用ENTRYPOINTCMDCMDstring将被附加到ENTRYPOINT ,生成容器的命令string。

所以基本上,你的configuration将尝试执行如下所示:

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

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

你真的想把它分成两个不同的容器,一个包含你的python应用程序,另一个包含你的数据库。 然后你可以为他们组成一个networking进行交stream。

docker的方式是分成两个容器,一个是应用程序,一个是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:27017


PS:关于你的timout,你需要了解入口点和CMD是如何工作的:

 ENTRYPOINT ["/usr/bin/mongod"] CMD python -c "print 'hello world'" 

这告诉docker运行这个命令来启动你的容器:

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

正如你所看到的,这是没有意义的。 入口点和CMD是一种串联。