Docker Deployment
Overview
Pattern de conteneurisation pour une application FastAPI/Python avec image slim, installation optimisée des dépendances, et lancement via uvicorn.
File Structure
code
/ ├── Dockerfile # Définition de l'image ├── src/cuve-api/ │ ├── requirements.txt # Dépendances Python │ ├── app/ │ │ └── main.py # Point d'entrée (app.main:app)
Implementation Pattern
Dockerfile complet
dockerfile
# Utilise une image Python slim pour minimiser la taille FROM python:3.12-slim # Évite les fichiers .pyc + logs immédiats ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 # Variables d'environnement applicatives ENV CUVE_MODE=sim WORKDIR /app # Dépendances système minimales RUN apt-get update \ && apt-get install -y --no-install-recommends curl \ && rm -rf /var/lib/apt/lists/* # Installer les deps Python d'abord (meilleur cache Docker) COPY src/cuve-api/requirements.txt /app/requirements.txt RUN pip install --no-cache-dir -r /app/requirements.txt # Copier le code COPY . /app # Dossier de travail où se trouve app.main:app WORKDIR /app/src/cuve-api EXPOSE 8000 CMD ["python", "-m", "uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
Commandes de build et run
bash
# Build de l'image docker build -t cuve-api . # Run en mode simulation docker run -p 8000:8000 cuve-api # Run en mode réel avec variables d'environnement docker run -p 8000:8000 \ -e CUVE_MODE=real \ -e CUVE_SENSOR_URL=http://192.168.1.50/json \ -v $(pwd)/data:/app/src/cuve-api/data \ cuve-api # Run avec fichier .env docker run -p 8000:8000 --env-file .env cuve-api
Optimisations de cache
L'ordre des instructions est important pour le cache Docker :
- •Image de base
- •Variables d'environnement système
- •Dépendances système (apt-get)
- •
requirements.txtseul (copié séparément) - •Installation pip
- •Code source complet
Cet ordre permet de ne pas réinstaller les dépendances si seul le code change.
Health check (optionnel)
dockerfile
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD curl -f http://localhost:8000/health || exit 1
Rules
Do
- •Utiliser
python:X.Y-slimpour réduire la taille de l'image - •Définir
PYTHONDONTWRITEBYTECODE=1etPYTHONUNBUFFERED=1 - •Copier
requirements.txtavant le code pour optimiser le cache - •Utiliser
--no-cache-diravec pip - •Nettoyer les caches apt (
rm -rf /var/lib/apt/lists/*) - •Exposer le port explicitement avec
EXPOSE - •Utiliser
--host 0.0.0.0pour écouter sur toutes les interfaces
Don't
- •Ne pas utiliser d'image
latesten production - •Ne pas copier
.envou secrets dans l'image - •Ne pas utiliser
pip installsans--no-cache-dir - •Ne pas oublier de définir le
WORKDIRcorrect pour uvicorn
File Location
- •Dockerfile :
/Dockerfile(racine du projet) - •Requirements :
src/cuve-api/requirements.txt