Pour déployer un service de modèle Granite TimeSeries FlowState R1 en environnement de production, un simple docker run n'est pas suffisant. Il est essentiel de créer une image Docker efficace, sécurisée et maintenable. Ce guide aborde les techniques d'optimisation du Dockerfile, la réduction de la taille de l'image, l'implémenattion de mesures de sécurité et l'amélioration de l'observabilité.
Objectifs d'optimisation
Un conteneur de production idéal doit :
- Avoir une taille réduite pour des déploimeents rapides.
- Exécuter des processus avec un utilisateur non privilégié pour limiter les risques.
- Inclure des vérifications de santé pour une surveillance automatique.
- Exploiter les couches de cache pour accélérer les builds.
Écriture d'un Dockerfile optimisé
Version initiale simplifiée
En supposant une application Python avec main.py comme point d'entrée et deps.txt pour les dépendances :
FROM python:3.9
WORKDIR /srv
COPY . .
RUN pip install --no-cache-dir -r deps.txt
CMD ["python", "main.py"]
Cette version manque d'optimisations.
Version avancée avec multi-stage et sécurité
# Étape de construction
FROM python:3.9-slim AS build-env
WORKDIR /build
COPY deps.txt .
RUN pip install --no-cache-dir --prefix=/opt -r deps.txt
# Étape d'exécution
FROM python:3.9-slim
RUN groupadd -r servicegrp && useradd -r -g servicegrp serviceusr
WORKDIR /srv
COPY --from=build-env /opt /opt
COPY --chown=serviceusr:servicegrp . .
ENV PATH=/opt/bin:$PATH
USER serviceusr
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost:8080/health || exit 1
CMD ["python", "main.py"]
Améliorations clés :
- Build multi-étapes : Réduit la taille finale en excluant les outils de construction.
- Utilisateur non root :
serviceusrexécute l'application. - Cache optimisé : Les dépendances sont copiées avant le code source pour limiter les reconstructions.
- Vérification de santé : Surveille le service via un endpoint.
Optimisations spécifiques pour les modèles
Gestion des dépendances système
# Étape de construction
FROM python:3.9-slim AS build-env
WORKDIR /build
COPY deps.txt .
RUN apt-get update && apt-get install -y --no-install-recommends gcc g++ && \
rm -rf /var/lib/apt/lists/*
RUN pip install --no-cache-dir --prefix=/opt -r deps.txt
# Étape d'exécution
FROM python:3.9-slim
RUN apt-get update && apt-get install -y --no-install-recommends libgomp1 && \
rm -rf /var/lib/apt/lists/*
RUN groupadd -r servicegrp && useradd -r -g servicegrp serviceusr
WORKDIR /srv
COPY --from=build-env /opt /opt
COPY --chown=serviceusr:servicegrp . .
ENV PATH=/opt/bin:$PATH
USER serviceusr
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost:8080/health || exit 1
CMD ["python", "main.py"]
Pour le support GPU, remplacez l'image de base par une variante NVIDIA CUDA compatible.
Optimisation des fichiers de modèle
FROM python:3.9-slim AS runtime
RUN apt-get update && apt-get install -y --no-install-recommends libgomp1 && \
rm -rf /var/lib/apt/lists/*
RUN groupadd -r servicegrp && useradd -r -g servicegrp serviceusr
WORKDIR /srv
COPY --chown=serviceusr:servicegrp ./models ./models
COPY --from=build-env /opt /opt
COPY --chown=serviceusr:servicegrp . .
ENV PATH=/opt/bin:$PATH
USER serviceusr
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost:8080/health || exit 1
CMD ["python", "main.py"]
Copier les fichiers de modèle volumineux et statiques en premier améliore l'efficacité du cache.
Bonnes pratiques de construction
Fichier .dockerignore
**/__pycache__
**/*.pyc
**/.git
**/.venv
**/venv
**/.env
**/*.log
**/data
**/test*
**/.idea
**/.vscode
README.md
Dockerfile
.dockerignore
Cela évite d'envoyer des fichiers inutiles au contexte de build.
Commandes de build et d'exécution
docker build -t granite-ts-service:v1 .
docker run -d -p 9090:8080 --name granite-svc granite-ts-service:v1
Vérification de l'optimisation
docker images granite-ts-service:v1
docker exec granite-svc whoami
docker inspect --format='{{json .State.Health}}' granite-svc
Ces commandes confirment la taille réduite de l'image, l'exécution en tant qu'utilisateur non root et le statut de santé.