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?
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).
[Sudo] docker ps -qf "name=<containername>"
docker inspect --format '{{ .NetworkSettings.IPAddress }}' <container_id>
http://<the_resulting_ip>:5000/
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).
J'ai effectué les étapes suivantes sur mon système:
flask
sur la première ligneCela 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.
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