Créer une Image Docker pour la Data : Le Guide du Dockerfile

@joekakone

Joseph Konka @joekakone

03/03/2026 · 9 min

Apprenez à concevoir un Dockerfile optimisé pour la Data : choix des images de base Python slim, mise en cache stratégique des dépendances pip, fichier .dockerignore et commandes de build.

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 libc au lieu de glibc). Or, la quasi-totalité des bibliothèques data scientifiques (NumPy, Pandas, SciPy, Scikit-learn, PyTorch) fournissent des binaires précompilés (wheels) pour glibc. Sur Alpine, pip ne 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 avec glibc).


⚡ 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 :

.dockerignore pour un projet Data
# 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 :

Dockerfile pour un pipeline ETL Python
# 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 :

Construire une image avec un nom et un tag
docker build -t pipeline-ventes:1.0 .
  • -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)#

Afficher toutes les images stockées localement
docker images
Exemple de sortie console
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 :

Supprimer une image par son nom ou son ID
docker rmi pipeline-ventes:1.0

[!TIP] Nettoyage automatique :
Pour éliminer en une seule commande toutes les images intermédiaires orphelines (dangling images) sans tag, utilisez :

docker image prune -f


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

Inscrivez-vous à une formation complète

Voir le catalogue