TP Dockerfile TP : conteneuriser une application python flask
Si vous ne l’avez pas encore fait, récupérez le dépot unifié de la formation : git clone https://github.com/e-lie/formation-docker-unified.git
Vous pouvez ensuite ouvrir le dossier section_images_dockerfiles/115_tp_dockerfile_flask_app_base/python_app
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é
Dockerfileet sauvegardez-le
-
Ajoutez en haut du fichier :
FROM python:3.9Cette 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
pythonvide :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.
:::tip Remarque
On pourrait ici être tenté d’installer python et pip (installeur de dépendance python) comme suit:
RUN apt-get update -yRUN apt-get install -y python3-pipCette é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.
:::
- Pour installer les dépendances python et configurer la variable d’environnement Flask ajoutez:
COPY ./requirements.txt /requirements.txtRUN 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 /microblogCOPY ./ /microblogNe pas faire tourner l’app en root
Section titled “Ne pas faire tourner l’app en root”- Avec l’aide du manuel de référence sur les Dockerfiles, faire en sorte que l’app
microblogsoit exécutée par un utilisateur appelémicroblog.
# Ajoute un user et groupe appelés microblogRUN useradd -ms /bin/bash -d /microblog microblogRUN chown -R microblog:microblog ./USER microblogConstruire 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:
whoamietid- Avec
ps aux, le serveur est-il lancé ? - Avec
docker run --rm -it microblogque se passe-t-il ?
Ajouter le CMD
Section titled “Ajouter le CMD”- Ajoutons la section de démarrage à la fin du Dockerfile, on va utuliser un script appelé
boot.shdé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
5000avec la commande :docker run -p 5000:5000 microblog -
Naviguez dans le navigateur à l’adresse
localhost:5000pour 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
Section titled “Correction: le dockerfile final”correction:
FROM python:3.9
COPY ./requirements.txt /requirements.txtRUN pip3 install -r /requirements.txt
WORKDIR /microblog
# Ajoute un user et groupe appelés microblogRUN useradd -ms /bin/bash -d /microblog microblog
COPY --chown=microblog:microblog ./ /microblog# RUN chown -R microblog:microblog /microblogUSER microblog
CMD ["./boot.sh"]Vous pouvez également retrouver la correction dans le dossier section_images_dockerfiles/115_tp_dockerfile_pour_flask_app du dépot unifié (énoncé et code de TP) de la formation