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时都必须重做。
此外,当使用ENTRYPOINT
和CMD
, CMD
string将被附加到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是一种串联。