Dockerized蒙戈需要年龄加载然后不运行蒙戈

问题描述:

我尝试(使用标准的泊坞窗教程),然后运行命令巨蟒创建一个简单的Dockerfile,它安装的MongoDB:Dockerized蒙戈需要年龄加载然后不运行蒙戈

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生成和输出疯狂的日志记录,缓慢地重新下载并慢慢重新安装每个软件包 - 这完全令人难以忍受。

2)docker ps显示没有蒙戈运行

3)python -c "print 'hello world'命令在端说,它运行,但不输出实际的字符串。

为什么这么复杂?

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

你Dockerfile是错误的。

了解CMD和入口点的交互方式: https://docs.docker.com/engine/reference/builder/#understand-how-cmd-and-entrypoint-interact

我特别建议是使用容器数据库,另一个用于Python应用程序。

泊坞窗的做法是分成2个容器,1个为应用程序,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 

应用。PY

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

运行它

docker-compose up --build 

与运行码头工人,组成为的话,你可以点在你的Python应用程序蒙戈就象这样:mongo:27017


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

ENTRYPOINT ["/usr/bin/mongod"] 

CMD python -c "print 'hello world'" 

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

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

正如你可以看到它是没有意义的。入口点和CMD是一种串联。

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

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

所以基本上,你的配置将试图执行一样的东西:

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

,而不是拆分为独立的命令。

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