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
步骤。
此外,当使用ENTRYPOINT
和CMD
时,CMD
字符串将被附加到ENTRYPOINT
,生成容器的命令字符串。
所以基本上,你的配置将试图执行一样的东西:
/usr/bin/mongod python -c "print 'hello world'
,而不是拆分为独立的命令。
你真的想把它分成两个不同的容器,一个容纳你的python应用程序,另一个容纳你的数据库。然后你可以为他们组成一个网络进行交流。