Pour déployer un modèle de machine learning ou planifier l'exécution quotidienne d'un script d'ingestion de données, vous devez fabriquer votre propre image Docker.
Une image Docker n'est pas un bloc monolithique : c'est un empilement de couches immuables en lecture seule (read-only layers). Chaque ligne de votre fichier Dockerfile ajoute une nouvelle couche par-dessus la précédente. Comprendre cette mécanique est le secret pour fabriquer des images légères, rapides à construire et parfaitement reproductibles.
🏗️ L'Anatomie des Instructions Clés du Dockerfile#
Le Dockerfile est le fichier sans extension (nommé exactement Dockerfile) situé à la racine de votre projet. Voici les instructions fondamentales que tout ingénieur Data doit maîtriser :
| Mot-clé | Rôle en ingénierie de données | Exemple typique |
|---|---|---|
FROM |
Définit l'image parente de départ (l'environnement de base) | FROM python:3.11-slim |
WORKDIR |
Fixe le dossier de travail courant dans le conteneur | WORKDIR /app |
COPY |
Copie des fichiers ou dossiers depuis votre machine locale vers le conteneur | COPY requirements.txt . |
RUN |
Exécute des commandes d'installation lors de la phase de fabrication | RUN pip install --no-cache-dir -r requirements.txt |
ENV |
Déclare des variables d'environnement permanentes | ENV PYTHONUNBUFFERED=1 |
EXPOSE |
Documente le port réseau sur lequel le service écoutera (informatif) | EXPOSE 8000 |
CMD |
Commande exécutée au démarrage du conteneur (remplaçable lors du run) |
CMD ["python", "main.py"] |
💡 Le Choix de l'Image de Base pour la Data : Attention au Piège d'Alpine !#
Dans le monde du développement web traditionnel (Node.js, Go), l'image ultralégère alpine (environ 5 Mo) est souvent plébiscitée.
[!WARNING] En Data Science et Data Engineering, évitez l'image Python Alpine !
Alpine utilise une implémentation C différente (musl libcau lieu deglibc). Or, la quasi-totalité des bibliothèques data scientifiques (NumPy, Pandas, SciPy, Scikit-learn, PyTorch) fournissent des binaires précompilés (wheels) pourglibc. Sur Alpine,pipne trouvera pas de binaire et sera obligé de recompiler tout le code C/C++ et Fortran depuis les sources. Votre build mettra 25 minutes au lieu de 40 secondes et produira au final une image souvent plus lourde !Le standard de l'industrie : Utilisez toujours les variantes
python:3.x-slim(basées sur Debian allégée avecglibc).
⚡ Le Secret de Performance : La Mise en Cache des Couches (Layer Caching)#
À chaque fois que vous exécutez docker build, Docker analyse chaque instruction. Si l'instruction et les fichiers copiés n'ont pas changé depuis le dernier build, Docker réutilise la couche en cache en 0,1 seconde.
Considérez ces deux manières d'écrire votre Dockerfile :
❌ LA MAUVAISE MÉTHODE (Lente et inefficace) :
┌────────────────────────────────────────────────────────┐
│ FROM python:3.11-slim │
│ WORKDIR /app │
│ COPY . . ◄── Change à chaque modif │
│ RUN pip install -r requirements.txt ◄── Réinstallé à chaque fois ! (5 min de perdues)
│ CMD ["python", "etl_pipeline.py"] │
└────────────────────────────────────────────────────────┘
✅ LA BONNE MÉTHODE (Optimisée pour la Data) :
┌────────────────────────────────────────────────────────┐
│ FROM python:3.11-slim │
│ WORKDIR /app │
│ COPY requirements.txt . ◄── Ne change presque jamais
│ RUN pip install -r requirements.txt ◄── 100% EN CACHE ! (0 seconde)
│ COPY . . ◄── Seul votre code est recopié
│ CMD ["python", "etl_pipeline.py"] │
└────────────────────────────────────────────────────────┘
En isolant le fichier requirements.txt et son installation pip avant la copie du reste de vos scripts, vous évitez de retélécharger des centaines de mégaoctets de librairies à chaque fois que vous corrigez une ligne de code Python !
🛡️ Le Fichier .dockerignore : Protégez vos Données !#
En Data Analytics, nous manipulons souvent des jeux de données volumineux (.csv, .parquet de plusieurs gigaoctets), des modèles pré-entraînés lourds, des notebooks exploratoires ou des fichiers secrets .env.
Si vous ne créez pas de fichier .dockerignore, Docker va transférer tous ces gigaoctets dans le contexte de build, ce qui ralentit considérablement la création de l'image et risque d'exposer des mots de passe en production.
Créez un fichier nommé .dockerignore à côté de votre Dockerfile :
# Environnements virtuels locaux
.venv/
env/
__pycache__/
*.pyc
# Données brutes et volumineuses (à monter via des volumes, pas dans l'image !)
data/
*.csv
*.parquet
*.sqlite
# Fichiers de configuration sensibles
.env
*.pem
credentials.json
# Fichiers système et Git
.git/
.gitignore
.vscode/
.ipynb_checkpoints/
🧪 Cas Pratique : Le Dockerfile d'un Pipeline d'Extraction & Transformation#
Voici le Dockerfile prêt pour la production d'un pipeline ETL Python qui extrait des données, calcule des agrégats avec Pandas et DuckDB, puis persiste les résultats :
# 1. Image de base officielle Python 3.11 allégée
FROM python:3.11-slim
# 2. Empêcher Python de mettre en buffer les sorties console (logs temps réel)
ENV PYTHONUNBUFFERED=1 \
PYTHONDONTWRITEBYTECODE=1
# 3. Répertoire de travail de l'application
WORKDIR /app
# 4. Installer les dépendances Python avec mise en cache
COPY requirements.txt .
RUN pip install --no-cache-dir --upgrade pip \
&& pip install --no-cache-dir -r requirements.txt
# 5. Copier les scripts métiers du pipeline
COPY src/ ./src/
COPY main.py .
# 6. Commande par défaut pour exécuter le pipeline
CMD ["python", "main.py"]
💻 Construire et Administrer vos Images en Ligne de Commande#
Une fois votre Dockerfile rédigé, passons aux commandes terminal :
1. Construire l'image (docker build)#
Placez-vous dans le répertoire contenant le Dockerfile :
-t pipeline-ventes:1.0: Assigne un nom (repository) et un tag de version à l'image..: Spécifie que le contexte de build est le répertoire courant.
2. Lister les images locales (docker images)#
REPOSITORY TAG IMAGE ID CREATED SIZE
pipeline-ventes 1.0 4a8f9c1b2e3d 2 minutes ago 215MB
python 3.11-slim 8f14b62d3a91 2 weeks ago 130MB
hello-world latest d2c94e258dcb 3 months ago 13.3kB
3. Supprimer une image (docker rmi)#
Pour libérer de l'espace disque en supprimant une image dont vous n'avez plus besoin :
[!TIP] Nettoyage automatique :
Pour éliminer en une seule commande toutes les images intermédiaires orphelines (dangling images) sans tag, utilisez :
Félicitations, votre image est compilée et stockée sur votre disque ! Dans la prochaine leçon, nous allons lui donner vie en lançant notre premier conteneur avec gestion des ports, des volumes et des variables d'environnement.
Commentaires