Lors du déploiement d'applications Flask dans Docker, il est possible de rencontrer des problèmes de connectivité du serveur même si le conteneur semble être en cours d'exécution. Cet article examinera un problème courant et fournira une solution pour garantir que l'application est accessible depuis l'extérieur du conteneur.
Considérez une application nommée "perfektimprezy" qui s'exécute sur Flask, avec le source suivante :
from flask import Flask app = Flask(__name__) app.debug = True @app.route('/') def main(): return 'hi' if __name__ == '__main__': app.run()
Lorsqu'il est déployé dans un conteneur Docker, le serveur semble fonctionner, mais l'application reste inaccessible de l'extérieur du conteneur.
Le Dockerfile utilisé pour le déploiement est :
# Dockerfile FROM dreen/flask MAINTAINER dreen WORKDIR /srv # Get source RUN mkdir -p /srv COPY perfektimprezy.tar.gz /srv/perfektimprezy.tar.gz RUN tar x -f perfektimprezy.tar.gz RUN rm perfektimprezy.tar.gz # Run server EXPOSE 5000 CMD ["python", "index.py"]
Les étapes de déploiement impliquent la création de l'image et l'exécution du conteneur avec le port 5000 exposé :
>$ sudo docker build -t perfektimprezy . >$ sudo docker run -i -p 5000:5000 -d perfektimprezy
Le conteneur semble fonctionner comme prévu, avec le serveur Flask écoute sur le port 5000 au sein du conteneur :
>$ sudo docker logs 1c50b67d45b1 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) * Restarting with stat
Cependant, les requêtes adressées à l'application depuis l'extérieur du conteneur entraînent des réponses vides :
>$ curl 127.0.0.1:5000 -v * Empty reply from server
Le problème réside dans la liaison de l'application Flask à l'interface localhost. Pour rendre l'application accessible depuis l'extérieur du conteneur, elle doit plutôt se lier à l'adresse 0.0.0.0.
Dans l'initialisation de l'application Flask, remplacez :
if __name__ == '__main__': app.run()
par :
if __name__ == '__main__': app.run(host='0.0.0.0')
Cette modification liera l'application à toutes les interfaces de l'hôte, la rendant accessible depuis l'extérieur du conteneur.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!