web-dev-qa-db-fra.com

Comprendre Gunicorn et Flask on Docker / Docker-Compose

J'ai du mal à faire fonctionner Flask et Gunicorn sur Docker avec 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()

D'après ma compréhension, le maître Gunicorn fonctionnera au port 8000 sur toutes les interfaces dans le conteneur

Et puis il va générer un nœud pour fonctionner sur le port 5000 dans le conteneur à 127.0.0.1/localhost.

De là, je relie le port 5000 du container à mon Hostport 8000

Je m'attendais à voir ma candidature depuis mon ordinateur hôte à http://127.0.0.1:8000 à la place, rien ne s'est passé et rien ne semblait se connecter.

Je l'ai déjà fait auparavant, mais je ne me souviens pas de ce que j'ai fait différemment.

(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 raison en est qu'il semble avoir engendré un travailleur et l'exécute au port 5000, je ne peux pas accéder à mon application via le port 8000

10
Kyle Calica-St

app.run() et gunicorn sont deux façons d'exécuter un serveur Web. Le premier est le serveur de développement Flask, et il est utile pour le développement mais ne doit pas être déployé en production. Vous ne devez pas exécuter les deux en même temps.

gunicorn doit être pointé vers l'objet app afin qu'il puisse l'importer et l'utiliser pour exécuter le serveur Web lui-même. C'est tout ce dont il a besoin.

12
Alex Hall

Au lieu de CMD [ "gunicorn", "-b", ":8000", "run" ]

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

Vous pouvez voir qu'au lieu de dire au processus gunicorn de run, vous dites plutôt au processus où look. L'application que vous souhaitez que gunicorn serve est app. Vous pouvez également ajouter plus d'options à la commande gunicorn telles que reload, le nombre de travailleurs, le délai d'expiration, les niveaux de journalisation, etc ...

Pour développer la réponse d'Alex Hall, vous ne voulez pas exécuter un serveur Flask en production, car la capacité de mise à l'échelle est très limitée. Selon le Flask = docs, la mention que:

Le serveur intégré de Flask n'est pas adapté à la production car il ne s'adapte pas bien et ne sert par défaut qu'une seule demande à la fois

13
Andrew Graham-Yooll