web-dev-qa-db-fra.com

Exécution de l'application Flask dans un conteneur Docker

J'ai construit une image Docker contenant une application de test Flask simple:

from flask import Flask 

app = Flask(__name__)

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

if __== "__main__":
    app.run(debug=True,Host='0.0.0.0')

en utilisant Dockerfile:

FROM ubuntu:latest
RUN apt-get update -y
RUN apt-get install -y python-pip python-dev build-essential
COPY . /app
WORKDIR /app
RUN pip install -r /app/requirements.txt
ENTRYPOINT ["python"]
CMD ["app.py"]

L'image Docker a été créée à l'aide de docker build -t flask-app . et a été créée avec succès:

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
flask-app           latest              fab0d79fd7ac        8 minutes ago       642.2 MB
ubuntu              latest              104bec311bcd        5 weeks ago         129 MB

et je l'ai exécuté en utilisant:

$ docker run -d -p 5000:5000 flask-app
e92b249dd02ca44489069b783fa9be713c7a14ea893061194e37c80f16d8c931

Je suppose que je peux tester l'application en pointant le navigateur sur http://localhost:5000/ mais le délai d'attente est expiré. Qu'est-ce qui pourrait mal tourner?

7
srm

Tout va bien d'ici. Faisons un peu de débogage.

Commençons par commencer notre conteneur avec un nom: docker run -d -p 5000:5000 --name flask-app-test flask-app

Vous pouvez également éviter l'indicateur -d et obtenir les journaux directement sur votre écran.

Tout d’abord, vérifiez si l’application Flask est vraiment en cours d’exécution ou s’est peut-être écrasée. Commencez avec un simple docker ps (voyez si vous remarquez quelque chose d'étrange là-bas) suivi de docker logs flask-app-test (ce seront les journaux de l'application Flask, est-ce qu'il s'est écrasé? Y a-t-il quelque chose d'étrange?)

Si tout semble bien aller jusqu'à ici, il est temps d'entrer dans le conteneur. Essayons avec docker exec -ti flask-app-test bash. Une fois que vous y êtes, installez wget par apt-get install wget et testez ensuite si le serveur Web fonctionne de l'intérieur en exécutant wget http://localhost:5000 et en cat- ting le fichier que nous espérons téléchargé (ls suivi de cat file.html, ou le nom du fichier).

4
Cristian Baldi
  1. Obtenir l'ID du conteneur: 

[Sudo] docker ps -qf "name=<containername>"

  1. Obtenir ce conteneur ip:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' <container_id>

  1. Puis connectez-vous à http://<the_resulting_ip>:5000/
3
lee-pai-long

Peut-être que votre moteur de docker ne fonctionne pas sur le même système d'exploitation que celui où vous lancez votre commande. Par exemple. Si vous utilisez Docker avec Windows, le moteur de Docker est (souvent) exécuté à l'intérieur d'une machine virtuelle avec une adresse IP différente. Vous devez donc écrire http: // [IP machine virtuelle]: 5000 /

Dans certaines configurations, l'URL correcte est http://192.168.99.100:5000/ / (car, par défaut, l'adresse IP de cette machine virtuelle est définie par défaut sur 192.168.99.100).

1
Marco Ribero

J'ai effectué les étapes suivantes sur mon système:

  1. Copiez votre code de flacon et votre fichier Docker
  2. Création d'un fichier exigences.txt avec flask sur la première ligne
  3. Construit l'image et lancez-la comme vous l'avez faite

Cela fonctionne bien avec moi:

$ curl localhost:5000
Hello World!

Le processus de menu fixe ne pose aucun problème et l'extraction des journaux est correcte:

  $ docker ps
  CONTAINER ID        IMAGE               COMMAND             CREATED               STATUS              PORTS                    NAMES
  0c0228a88719        flask-app           "python app.py"     25 seconds ago      Up 24 seconds       0.0.0.0:5000->5000/tcp   frosty_borg

$ docker logs 0c0228a88719
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger pin code: 216-035-222
172.17.0.1 - - [22/Jan/2017 12:56:37] "GET / HTTP/1.1" 200 -

Lorsque vous démarrez votre conteneur Docker, vérifiez s'il écoute le port 5000. Par exemple, sur mon système:

     $ netstat -atn | grep 5000
     tcp6       0      0  ::1.5000               *.*                    LISTEN     
     tcp4       0      0  *.5000                 *.*                    LISTEN     
     $ docker stop 0c0228a88719
0c0228a88719
     $ netstat -atn | grep 5000
     $ # stops listening

Surtout, comment vous exécutez dpcker, est-il exécuté de manière native sur une machine de bureau Linux? Ou l'exécutez-vous sur une machine virtuelle Linux sur un hôte Mac/Windows (via un service tel qu'un ordinateur fixe ou une autre méthode)? Si tel est le cas, le problème pourrait être que l'adresse IP à laquelle vous devez accéder n'est pas localhost, mais l'adresse IP de la machine virtuelle.

1
Angelos

Manquer cette partie dans Dockerfile 

COPY ./requirements.txt /app/requirements.txt

Add this line to your Dockerfile before

app.py

from flask import Flask
app = Flask(__name__)

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

if __== "__main__":
    app.run(debug=True,Host='0.0.0.0')

Requirements.txt

Flask==0.10.1
#or it can be any version

Dockerfile

FROM ubuntu:16.04
MAINTANER Your Name "[email protected]"
RUN apt-get update -y && \
    apt-get install -y python-pip python-dev
#your Dockerfile is missing this line
COPY ./requirements.txt /app/requirements.txt
WORKDIR /app
RUN pip install -r requirements.txt
COPY . /app
ENTRYPOINT [ "python" ]
CMD [ "app.py" ]

Commandes de docker à exécuter

docker build -t flaskapp:latest .
#flask runs in default port 5000
docker run -d -p 5000:5000 flaskapp
0
Jobin Mathew