Intégration de Flask (Python) dans docker ========================================= ![category](développement) ![tag](docker) ![tag](python) ![tag](flask) Cette documentation présente l'utilisation de Flask (framework web écrit en python) dans un docker. Objectif -------- Création d'un site web composé: - d'éléments statiques distribué au client par un docker nginx - d'éléments dynamique distribué par flask (webservice) .. aafig:: :textual: /-------\ /-------\ | proxy | | front | +-------+-------+-------+ | nginx | | nginx | \---+---/ \-------/ | | /---------\ | | service | +-----------+---------+ | python | \---------/ Développement ------------- Nous créer l'arboresence suivante ![201605280928_1.png](./upload/201605280928_1.png) notre docker-compose.yml est le suivant ``` version: '2' services: proxy: build: proxy/. ports: - "80:80" depends_on: - service - front front: build: front/. service: build: service/. ``` ```note afin de simplifier notre exemple je ne génère pas de volume partagé. cela devrait être le cas pour de gros projet ``` Proxy ~~~~~ Il s'agit simplement d'un service nginx qui distribue les demandes entre front et service suivant l'url: tout ce qui débute par ws/ sera envoyé vers service. le fichier Dockerfile ``` FROM nginx:1.9 COPY ./src/default.conf /etc/nginx/conf.d/default.conf ``` le fichier default.conf ```bash server { listen 80; location / { proxy_pass http://front; } location /ws { proxy_pass http://service:5000 } } ``` Front ~~~~~ Il s'agit d'un service nginx distribuant des fichiers statiques. Dans notre exemple nous rajoutons des librairies angularjs le fichier Dockerfile ``` FROM nginx:1.9 COPY ./src/default.conf /etc/nginx/conf.d/default.conf RUN apt-get update && apt-get install -y \ git \ git-core \ nodejs \ npm RUN ln -s /usr/bin/nodejs /usr/bin/node RUN echo '{ "allow_root": true }' > /root/.bowerrc #################### application ########################################### RUN npm install -g bower RUN cd /usr/share/nginx/html && bower install angular-material RUN mkdir /usr/share/nginx/html/app COPY ./src/index.html /usr/share/nginx/html/app/index.html ``` Le fichier default.conf ```bash server { listen 80; server_name localhost; location / { root /usr/share/nginx/html/app; index index.html index.htm; } location /bower_components { alias /usr/share/nginx/html/bower_components; } } ``` Le fichier index.html ```html
Message de flask

{{ hello }}

``` Service ~~~~~~~ Il s'agit d'un service python utilisant le module flask. Il permet de répondre sous un format json le fichier Dockerfile ``` FROM python:3.4-wheezy COPY ./src/entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh RUN pip install flask RUN mkdir /app COPY ./src/app.py /app/app.py EXPOSE 80 ENTRYPOINT ["/entrypoint.sh"] CMD ["app"] ``` le fichier entrypoint.sh ```bash #!/bin/bash set -e if [ "$1" = 'app' ]; then python /app/app.py fi exec "$@" ``` notre application flask, app.py ```python from flask import Flask import json app = Flask(__name__) @app.route("/ws/hello") def hello(): return json.dumps({"msg": "Hello World!"}) if __name__ == "__main__": app.run(host="0.0.0.0", port="5000") ``` Notre application répond au url du type http://ip:5000/hello . Avec l'utilisation du proxy il répondra à http://ip/ws/hello ```note pourquoi utiliser un fichier entrypoint.sh? cela permet par la suite une fois le container lancé de prendre la main avec ce type de commande ``` docker exec -it service bash ``` ``` Mise en production ------------------ rien de plus simple ```bash docker-compose up```