2
votes

Impossible de se connecter à l'application Flask avec gunicorn dans un conteneur Docker

J'ai une application flask et j'essaie de l'exécuter dans un conteneur docker en utilisant gunicorn.

Voici mon fichier docker

    curl -X POST http://172.17.0.2:8000/login -H 'cache-control: no-cache' -H 'content-type: application/json' -d '<SOME_PAYLOAD>'
curl: (7) Failed to connect to 172.17.0.2 port 8000: Operation timed out

Voici comment je suis exécuter le conteneur -

docker run <name>

Et voici comment je le teste-

FROM python:3.6

WORKDIR /app

COPY ./requirements.txt /.requirements.txt

COPY . /app

# Install any needed packages specified in requirements.txt
RUN pip install -r requirements.txt

EXPOSE 8000

ENV FLASK_APP=<some_name>
ENV FLASK_ENV=development


CMD gunicorn -b :8000 -w 4 app:app

J'ai parcouru un couple de réponses sur ce site

Pour autant que je sache, je suis

  1. Exposer le port
  2. Trouver la bonne adresse IP
  3. Accéder au bon port sur mon ordinateur hôte
  4. Mappage du port de mon ordinateur hôte sur mon conteneur Docker.

Pourquoi cette opération expire-t-elle?

J'ai également essayé

  1. CMD gunicorn -b 0.0.0.0:8000 -w 4 app: app qui devrait tout mapper
  2. docker run -p 8000: 8000 itératif , ce qui devrait forcer le mappage entre les ports sur l'hôte et le conteneur.

Mais en vain.

Sur mon ordinateur, l'application fonctionne correctement.

Pourquoi ne fonctionne-t-il pas dans le conteneur Docker?


0 commentaires

3 Réponses :


0
votes

Vous exécutez votre conteneur Docker de manière incorrecte

docker run -p 8080:8080 <the-name-of-your-image>

En supposant que votre Dockerfile obtient les fichiers corrects, cela devrait résoudre le problème

allez à localhost: 8080 pour vérifier p >


0 commentaires

0
votes

D'après mon expérience, j'ai trouvé que la méthode ci-dessous était plus efficace lorsqu'il s'agissait de gunicorn et docker for flask. Je vous suggère d'exécuter le CMD dans le Dockerfile comme suit:

CMD ["gunicorn", "-w", "5", "-b", "0.0.0.0:8000", "<scriptname>:<runtimefunction>"]

Le nom du script dans votre cas sera très probablement "app.py" et la fonction d'exécution "app". Juste pour indiquer ce que je suggère:

dans app.py

from flask import Flask

app = Flask(__name__)

@app.route("/")
def home():
    return "Hello, World!"

if __name__ == "__main__":
    app.run(debug=True)

Pour ajouter également les ouvriers:

CMD ["gunicorn", "-b", "0.0.0.0:8000", "<scriptname>:<runtimefunction>"]

J'espère que cela vous aidera.


0 commentaires

0
votes

J'ai également rencontré ce problème, le problème bien sûr étant que j'avais spécifié un port différent quelque part dans la chaîne d'outils.

Vérifiez à nouveau vos ports!

app.py

docker run -p 8001:8001 "$CONTAINER_TAG"

Dockerfile

FROM foo-image:tag
...
RUN pip3 install gunicorn Flask
COPY *.py /app/
WORKDIR /app
EXPOSE 8001
CMD ["gunicorn", "-b", "0.0.0.0:8001", "--workers", "2", "app:app"]

exécuter la commande
https://docs.docker.com/engine/reference/run / # exposer-les-ports

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return "example"


0 commentaires