Pourquoi Dockerfile : bonnes pratiques ?
Le développement moderne est souvent caractérisé par l'utilisation de systèmes d'exploitation légers, des conteneurs et des microservices. Les Dockerfiles jouent un rôle crucial dans ce processus en définissant comment une image Docker doit être construite à partir d'un ensemble de instructions.
Un cas concret d'utilisation concerne le déploiement d'une application web sur un environnement cloud. En utilisant un Dockerfile, on peut s'assurer que l'image contient exactement les dépendances nécessaires et que la configuration est cohérente entre différents environnements.
Prerequis
- Connaissance de base du système d'exploitation Linux
- Familiarité avec les concepts de Docker
- Installation de Docker (version 20.10 ou ultérieure)
- Connaissance des langages de programmation courants utilisés pour créer des applications (Python, Node.js, Java, etc.)
Concepts fondamentaux
1. FROM
La première instruction dans un Dockerfile est FROM, qui spécifie la base image sur laquelle se construira l'image finale.
## Base image
FROM python:3.9-slim
2. WORKDIR
WORKDIR définit le répertoire de travail pour les instructions suivantes.
## Set working directory
WORKDIR /app
3. COPY
COPY copie des fichiers ou des répertoires du système d'hôte dans l'image Docker.
## Copy application files
COPY . /app
4. RUN
RUN exécute une commande dans un nouveau layer de l'image.
## Install dependencies
RUN pip install --no-cache-dir -r requirements.txt
5. CMD et ENTRYPOINT
CMD définit la commande par défaut à exécuter quand l'image est lancée, tandis que ENTRYPOINT spécifie un shell ou un programme qui sera exécuté.
## Define the default command to run
CMD ["python", "app.py"]
Mise en pratique : projet fil rouge
Nous allons créer une application simple d'un gestionnaire de tâches. Voici les étapes pour la construire :
Étape 1 : Créer un nouveau répertoire et initialiser un Dockerfile
mkdir task-manager
cd task-manager
touch Dockerfile
Étape 2 : Définir la base image et le répertoire de travail
## Base image
FROM python:3.9-slim
## Set working directory
WORKDIR /app
Étape 3 : Copier les fichiers nécessaires dans l'image
## Copy application files
COPY . /app
Étape 4 : Installer les dépendances
Assurez-vous que vous avez un requirements.txt avec les dépendances nécessaires.
echo "Flask==2.0.1" > requirements.txt
Ajoutez cette ligne dans votre Dockerfile :
## Install dependencies
RUN pip install --no-cache-dir -r requirements.txt
Étape 5 : Définir la commande par défaut
Assurez-vous que vous avez un fichier app.py avec une application Flask simple.
## app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello, Task Manager!"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
Ajoutez cette ligne dans votre Dockerfile :
## Define the default command to run
CMD ["python", "app.py"]
Étape 6 : Construire l'image
docker build -t task-manager .
Étape 7 : Lancer le conteneur
docker run -p 5000:5000 task-manager
Accédez à http://localhost:5000 dans votre navigateur pour voir votre application en action.
Erreurs frequentes et debugging
1. "error loading manifest from blob"
## ❌ Mauvais
RUN pip install -r requirements.txt
bash
## Error message
error loading manifest from blob: sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
docker
## ✅ Correct
RUN pip install --no-cache-dir -r requirements.txt
2. "Permission denied"
## ❌ Mauvais
COPY . /app
bash
## Error message
Error response from daemon: failed to create symbolic link on mounter: mkdir /var/lib/docker/overlay2/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/mounts/0/files: permission denied
docker
## ✅ Correct
RUN chown -R $(whoami):$(whoami) /app && COPY . /app
3. "No such file or directory"
## ❌ Mauvais
CMD ["python", "app.py"]
bash
## Error message
/usr/bin/python: can't open file 'app.py': [Errno 2] No such file or directory
docker
## ✅ Correct
COPY app.py /app/app.py
CMD ["python", "/app/app.py"]
Pour aller plus loin
Utilisation de layers : Apprenez à optimiser votre Dockerfile en minimisant le nombre de couches.
Utilisation de .dockerignore : Créez un fichier
.dockerignorepour éviter d'ajouter des fichiers inutiles dans votre image.Automatisation du build et du déploiement : Intégrez votre Dockerfile dans un pipeline CI/CD pour automatiser le build et le déploiement.
Défi pratique
Créez une application simple d'un API de blog utilisant Flask. Votre application devrait permettre aux utilisateurs de créer, lire, mettre à jour et supprimer des articles.
Construire votre Dockerfile en suivant les étapes similaires à celles du projet fil rouge. Assurez-vous que vous utilisez une base image appropriée, que vous copiez correctement les fichiers nécessaires, que vous installez les dépendances, et que vous définissez la commande par défaut pour exécuter votre application.
Bonne chance avec votre défis !