Aller au contenu principal

TP 2+ : conteneuriser une application flask

TP - Dockerfile pour une application web flask​

  • RĂ©cupĂ©rez d’abord une application Flask exemple en la clonant :
git clone https://github.com/uptime-formation/microblog/

Déployer une application Flask manuellement à chaque fois est relativement pénible. Pour que les dépendances de deux projets Python ne se perturbent pas, il faut normalement utiliser un environnement virtuel virtualenv pour séparer ces deux apps.

Avec Docker, les projets sont dĂ©jĂ  isolĂ©s dans des conteneurs. Nous allons donc construire une image de conteneur pour empaqueter l’application et la manipuler plus facilement. Assurez-vous que Docker est installĂ©.

  • Dans le dossier du projet ajoutez un fichier nommĂ© Dockerfile et sauvegardez-le

  • Normalement, VSCode vous propose d'ajouter l'extension Docker. Il va nous faciliter la vie, installez-le. Une nouvelle icĂŽne apparaĂźt dans la barre latĂ©rale de gauche, vous pouvez y voir les images tĂ©lĂ©chargĂ©es et les conteneurs existants. L'extension ajoute aussi des informations utiles aux instructions Dockerfile quand vous survolez un mot-clĂ© avec la souris.

  • Ajoutez en haut du fichier : FROM python:3.9 Cette commande indique que notre image de base est la version 3.9 de Python. Quel OS est utilisĂ© ? VĂ©rifier en examinant l'image ou via le Docker Hub.

  • Nous pouvons dĂ©jĂ  contruire un conteneur Ă  partir de ce modĂšle Ubuntu vide : docker build -t microblog .

  • Une fois la construction terminĂ©e lancez le conteneur.

  • Le conteneur s’arrĂȘte immĂ©diatement. En effet il ne contient aucune commande bloquante et nous n'avons prĂ©cisĂ© aucune commande au lancement.

Remarque

On pourrait ici ĂȘtre tentĂ© d'installer python et pip (installeur de dĂ©pendance python) comme suit:

RUN apt-get update -y
RUN apt-get install -y python3-pip

Cette Ă©tape, qui aurait pu ĂȘtre nĂ©cessaire dans un autre contexte : en partant d'un linux vide comme ubuntu est ici inutile car l'image officielle python contient dĂ©jĂ  ces Ă©lĂ©ments.

  • Reconstruisez votre image. Si tout se passe bien, poursuivez.

  • Pour installer les dĂ©pendances python et configurer la variable d'environnement Flask ajoutez:

COPY ./requirements.txt /requirements.txt
RUN pip3 install -r requirements.txt
  • Reconstruisez votre image. Si tout se passe bien, poursuivez.

  • Ensuite, copions le code de l’application Ă  l’intĂ©rieur du conteneur. Pour cela ajoutez les lignes :

WORKDIR /microblog
COPY ./ /microblog

Ne pas faire tourner l'app en root​

# Ajoute un user et groupe appelés microblog
RUN useradd -ms /bin/bash -d /microblog microblog
RUN chown -R microblog:microblog ./
USER microblog

Construire l'application avec docker build, la lancer et vérifier avec docker exec, whoami et id l'utilisateur avec lequel tourne le conteneur.

  • docker build -t microblog .
  • docker run --rm -it microblog bash

Une fois dans le conteneur lancez:

  • whoami et id
  • Avec ps aux, le serveur est-il lancĂ© ?
  • Avec docker run --rm -it microblog que se passe-t-il ?

TP Finir le Dockerfile prĂ©cĂ©dent (il manquait la CMD)​

  • Ajoutons la section de dĂ©marrage Ă  la fin du Dockerfile, on va utuliser un script appelĂ© boot.sh dĂ©jĂ  prĂ©sent dans le projet qu'on a clonĂ©:
CMD ["./boot.sh"]
  • Reconstruisez l'image et lancez un conteneur basĂ© sur l'image en ouvrant le port 5000 avec la commande : docker run -p 5000:5000 microblog

  • Naviguez dans le navigateur Ă  l’adresse localhost:5000 pour admirer le prototype microblog.

  • Lancez un deuxiĂšme container cette fois avec : docker run -d -p 5001:5000 microblog

  • Une deuxiĂšme instance de l’app est maintenant en fonctionnement et accessible Ă  l’adresse localhost:5001

Correction: le dockerfile final​

correction:

FROM python:3.9
RUN apt-get update -y
RUN apt-get install -y python3-pip
COPY ./requirements.txt /requirements.txt
RUN pip3 install -r requirements.txt
WORKDIR /microblog
COPY ./ /microblog
# Ajoute un user et groupe appelés microblog
RUN useradd -ms /bin/bash -d /microblog microblog
RUN chown -R microblog:microblog ./
USER microblog