Comprensión de Gunicorn y Flask en Docker / Docker-Compose

Tengo problemas para que Flask y Gunicorn trabajen correctamente en Docker usando Docker-compose

Dockerfile:

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" ] 

Docker-Compose.yml:

 version: '2' services: web: build: . volumes: - ./:/var/www/crypto ports: - "5000:5000" 

run.py:

 from app import app app.run() 

Según tengo entendido, el maestro de Gunicorn se ejecutará en el puerto 8000 en todas las interfaces del contenedor

Y luego generará un nodo para ejecutar en el puerto 5000 en el contenedor en 127.0.0.1/localhost.

Desde allí, enlace el puerto 5000 en el container a mi puerto de host 8000

Esperaba ver mi aplicación desde mi computadora host en http://127.0.0.1:8000 no pasó nada y parecía que nada se estaba conectando.

He hecho esto antes, pero no puedo recordar lo que hice diferente.

(env) paper-street:CoinSlack kyle$ gunicorn -b :8000 run [2017-09-16 17:43:59 -0700] [15402] [INFO] Starting gunicorn 19.7.1 [2017-09-16 17:43:59 -0700] [15402] [INFO] Listening at: http://0.0.0.0:8000 (15402) [2017-09-16 17:43:59 -0700] [15402] [INFO] Using worker: sync [2017-09-16 17:43:59 -0700] [15405] [INFO] Booting worker with pid: 15405 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

^ la razón es porque parece que generó un trabajador y lo está ejecutando en el puerto 5000, no puedo acceder a mi aplicación a través del puerto 8000

app.run() y gunicorn son dos forms de ejecutar un server web. El primero es el server de desarrollo Flask, y es útil para el desarrollo, pero no debe implementarse en producción. No deberías ejecutar ambos al mismo time.

gunicorn debe apuntar al object de la app para que pueda importarlo y usarlo para ejecutar el server web. Eso es todo lo que necesita.

En lugar de CMD [ "gunicorn", "-b", ":8000", "run" ]

Hacer CMD ["gunicorn", "app:app" "-b", "0.0.0.0:8000"]

Puedes ver que en vez de decirle al process de gunicornio que te run , dile al process dónde mirar . La aplicación que desea que sirva a gunicorn es la app . También puede agregar más opciones al command gunicornio, como la reload , el número de trabajadores, el time de espera, los niveles de logging, etc.

Para ampliar la respuesta de Alex Hall, no desea ejecutar un server Flask en producción, ya que la capacidad de escalar es muy limitada. De acuerdo con los documentos de Flask, la mención de que:

El server integrado de Flask no es adecuado para producción, ya que no escala bien y, por defecto, solo sirve una request a la vez.