我无法使用Docker-compose让Flask和Gunicorn在Docker上正常工作
Dockerfile:
whereDate / whereMonth / whereDay / whereYear
Docker-Compose.yml:
FROM ubuntu:latest
MAINTAINER Kyle Calica "Kyle Calica"
RUN apt-get update -y
RUN apt-get install -y python3-dev build-essential python-pip gunicorn
RUN pip install --upgrade setuptools
RUN pip install ez_setup
COPY . /app
WORKDIR /app
RUN pip install -r ./app/requirements.txt
CMD [ "gunicorn", "-b", ":8000", "run" ]
run.py:
version: '2'
services:
web:
build: .
volumes:
- ./:/var/www/crypto
ports:
- "5000:5000"
根据我的理解,Gunicorn master将在容器
中的所有接口上的端口8000上运行然后它会产生一个节点,在127.0.0.1/localhost的容器中的端口5000处运行。
从那里我将from app import app
app.run()
中的端口5000链接到我的container
端口host
我希望在8000
的主机上看到我的应用程序
相反没有任何事情发生,似乎没有任何联系。
我以前做过这个,但不记得我做了什么不同的事情。
http://127.0.0.1:8000
^原因是因为它似乎产生了一个工人并在端口5000运行它,我无法通过端口8000访问我的应用程序
答案 0 :(得分:10)
app.run()
和gunicorn
是运行网络服务器的两种方式。第一个是Flask开发服务器,它对开发很有用,但不应该在生产中部署。你不应该同时跑两个。
gunicorn
应该指向app
对象,以便它可以导入它并使用它来运行Web服务器本身。这就是它所需要的一切。
答案 1 :(得分:10)
而不是CMD [ "gunicorn", "-b", ":8000", "run" ]
执行CMD ["gunicorn", "app:app", "-b", "0.0.0.0:8000"]
你可以看到,而不是告诉gunicorn进程run
而是告诉进程看起来的位置。您希望gunicorn提供的应用程序是app
。您还可以为gunicorn命令添加更多选项,例如reload
,工作人员数量,超时,日志级别等...
要扩展Alex Hall的答案,您不希望在生产中运行Flask服务器,因为扩展能力非常有限。根据Flask文档,提到:
Flask的内置服务器不适合生产,因为它没有 刻度很好,默认情况下一次只能提供一个请求