Construire une image Docker pour une application Python

1. Préparation de l'application Python

Assurez-vous que votre application dispose d'une structure de projet de base :

mon-application-python/
├── main.py           # Point d'entrée principal
├── dependencies.txt  # Fichier des dépendances
└── Dockerfile        # Configuration pour la conteneurisation

2. Rédaction du Dockerfile

# Sélection d'une image Python officielle légère
FROM python:3.9-slim

# Définition du répertoire de travail
WORKDIR /usr/src/app

# Ajout des fichiers de dépendances
COPY dependencies.txt .

# Installation des paquets requis
RUN pip install --no-cache-dir -r dependencies.txt

# Copie du code source de l'application
COPY . .

# Ouverture du port réseau (si nécessaire)
EXPOSE 8080

# Configuration de l'environnement Python
ENV PYTHONUNBUFFERED=1

# Lancement de l'application
CMD ["python", "main.py"]

3. Ficheir de dépnedances (dependencies.txt)

fastapi==0.100.0
uvicorn==0.23.0
pydantic==2.0.0

4. Application exemple (main.py)

# Exemple d'API avec FastAPI
from fastapi import FastAPI
import uvicorn

service = FastAPI()

@service.get("/")
def accueil():
    return {"message": "Bonjour depuis le conteneur"}

@service.get("/status")
def verifier_sante():
    return {"etat": "actif"}, 200

if __name__ == '__main__':
    uvicorn.run(service, host="0.0.0.0", port=8080)

5. Construction de l'image

# Créer l'image avec un tag
docker build -t api-python .

# Spécifier une version
docker build -t api-python:2.1 .

# Construction sans utilisation du cache
docker build --no-cache -t api-python .

6. Lancement du conteneur

# Exécuter en arrière-plan
docker run -d -p 8080:8080 --name service-api api-python

# Lancer en mode interactif (pour le débogage)
docker run -it --rm api-python /bin/sh

# Passer des variables d'environnement
docker run -d -p 8080:8080 -e APP_ENV=prod api-python

7. Recommandations d'optimisation

Construction multi-étapes (réduire la taille de l'image)

# Étape de compilation
FROM python:3.9-slim AS construction
WORKDIR /build
COPY dependencies.txt .
RUN pip install --user --no-cache-dir -r dependencies.txt

# Étape d'exécution
FROM python:3.9-slim
WORKDIR /app
COPY --from=construction /root/.local /root/.local
COPY . .
ENV PATH="/root/.local/bin:${PATH}"
CMD ["python", "main.py"]

Fichier .dockerignore
Créez un fichier .dockerignore avec le contenu suivant :

__pycache__
*.pyc
*.pyo
.git
.env
env/
*.txt
*.md
.dockerignore

8. Configuration avancée pour la production

FROM python:3.9-slim

# Installation des dépendances système
RUN apt-get update && apt-get install -y --no-install-recommends \
    build-essential \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /opt/app

# Installation des dépendances Python
COPY dependencies.txt .
RUN pip install --no-cache-dir -r dependencies.txt

# Création d'un utilisateur dédié
RUN adduser --disabled-password --gecos "" --uid 1000 appuser
COPY . .
RUN chown -R appuser:appuser /opt/app
USER appuser

# Vérification de santé
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
    CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8080/status')"

EXPOSE 8080
CMD ["python", "main.py"]

9. Commandes Docker essentielles

# Lister les images disponibles
docker image ls

# Voir les conteneurs actifs
docker container ps

# Consulter les journaux d'un conteneur
docker logs service-api

# Arrêter un conteneur
docker container stop service-api

# Supprimer un conteneur
docker container rm service-api

# Effacer une image
docker image rm api-python

# Exporter une image vers un fichier
docker save -o api-python.tar api-python

# Importer une image depuis un fichier
docker load -i api-python.tar

10. Publication sur un regitsre d'images

# Appliquer un tag à l'image
docker tag api-python utilisateur/api-python:latest

# Pousser vers Docker Hub
docker push utilisateur/api-python:latest

# Pousser vers un registre privé
docker tag api-python registre.mondomaine.com/api-python:latest
docker push registre.mondomaine.com/api-python:latest

Points de vigilance

  • Évitez d'exécuter l'application en tant que root - créez un utilisateur dédié
  • Préférez des tags de version spécifiques sur l'image de base - évitez :latest
  • Organisez les couches de l'image - placez les éléments qui changent rarement en premier
  • Purgez les caches lors de l'installation - utilisez --no-cache-dir pour minimiser la taille
  • Intégrez des vérifications de santé - essentiel pour l'orchestration des conteneurs

Étiquettes: Docker Python conteneurisation Dockerfile Flask

Publié le 20 juillet à 14h12