Exercice Dockerfile C
Objectifs
Choisir une image de base adaptée.
Structurer un Dockerfile avec bonnes pratiques :
LABEL,ARG,ENV,WORKDIR,COPY,RUN,EXPOSE,VOLUME,HEALTHCHECK,USER,ENTRYPOINT/CMD.Réduire la taille d’image via multi-stage build et couche cache.
Exécuter le service en non-root.
Comprendre .dockerignore, variables d’env, et ports.
Donner toutes les commandes Docker utilisées.
Énoncé
Vous devez conteneuriser une petite API Flask qui expose :
GET /→{"msg":"Hello from Docker!"}GET /health→{"status":"ok"}
Contraintes :
Écrire un Dockerfile multi-stage:
Stage builder : installation des dépendances (roue/compilation si nécessaire).
Stage runtime : image plus légère, copie minimaliste.
Ajouter des LABEL (auteur, version, description).
Gérer un ARG
APP_ENV(valeurs:devouprod) avec une ENV par défaut.Définir
WORKDIR,COPY(en respectant un.dockerignore).Créer un utilisateur non-root et exécuter l’appli avec cet utilisateur.
Ouvrir le port 8000 (
EXPOSE 8000).Ajouter un HEALTHCHECK qui vérifie
http://localhost:8000/health.Utiliser
ENTRYPOINT+CMDcorrectement (ENTRYPOINT = processus, CMD = args).Déclarer un VOLUME
/app/logs(les logs y sont écrits).
Livrables :
Dockerfile.dockerignoreCode minimal de l’API (
app.py,requirements.txt)Commandes pour build, run, test, inspecter la santé.
Squelette de projet
project/
├─ app.py
├─ requirements.txt
├─ Dockerfile
└─ .dockerignore
app.py
from flask import Flask, jsonify
import os, sys, pathlib
app = Flask(__name__)
LOG_DIR = pathlib.Path("/app/logs")
LOG_DIR.mkdir(parents=True, exist_ok=True)
open(LOG_DIR / "app.log", "a").close()
@app.route("/")
def root():
return jsonify(msg="Hello from Docker!", env=os.getenv("APP_ENV", "dev"))
@app.route("/health")
def health():
return jsonify(status="ok")
if __name__ == "__main__":
# Bind sur 0.0.0.0 pour être accessible depuis le conteneur
app.run(host="0.0.0.0", port=8000)
requirements.txt
flask==3.0.3
.dockerignore
Voici une version incomplete, veuillez le completer pour éviter que des fichiers ou répertoires non désirés ce retrouvent dans l’image Docker.
__pycache__/
*.pyc
*.log
.git
.gitignore
.env
.cache/
Tips
Voici les packages apt qui seront utiles d’installer :
build-essential,curl,ca-certificatesUtiliser de préférence
pip wheelpour optimiser la taille de l’image - Pip Wheel DocPour le health check utiliser
curlcomme ceci :
HEALTHCHECK --interval=10s --timeout=2s --retries=3 CMD curl -f http://localhost:8000/health || exit 1
Pour aller plus loin
Mesurer la taille de l’image et la réduire (changer de base :
slimvsalpine).Ajouter un USER ID via
--build-arg UID=10001.Multi-stage avancé : figer
pip wheeldans le builder puis copier uniquement les wheels.