我尝试创建一个安装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(警告,长)
答案 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。 你会注意到我没有自己安装任何东西。
尝试此操作<强> 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
步骤。
此外,当使用ENTRYPOINT
和CMD
时,CMD
字符串将附加到ENTRYPOINT
,生成容器的命令字符串。< / p>
基本上,您的配置将尝试执行以下操作:
/usr/bin/mongod python -c "print 'hello world'
而不是将其拆分为单独的命令。
您真的希望将其拆分为两个不同的容器,一个包含您的python应用程序,另一个包含您的数据库。然后,您可以组建一个网络供他们进行通信。