Files
2026-08-07 17:19:49 +02:00

53 lines
1.9 KiB
Docker

# simple-cost-dashboard
#
# Une seule image sert deux usages, avec la commande par défaut adaptée au
# déploiement Kubernetes envisagé :
# - Deployment "web" : lance l'API + le frontend (uvicorn), commande par défaut
# - CronJob "collect" : même image, commande surchargée :
# command: ["python", "collector/collect.py"]
# args: ["--config", "/config/config.json", "--db", "/data/cost_dashboard.db"]
#
# Ça évite de maintenir deux images distinctes pour deux moitiés de la même
# application.
FROM python:3.12-slim
# Dépendances système minimales (certificats TLS pour les appels AWS/Azure/
# taux de change ; rien de plus n'est nécessaire, pas de compilation requise
# par boto3/azure-identity/fastapi).
RUN apt-get update \
&& apt-get install -y --no-install-recommends ca-certificates \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY api/ ./api/
COPY collector/ ./collector/
COPY db/ ./db/
COPY frontend/ ./frontend/
# Utilisateur non-root (bonne pratique, souvent imposée par les PodSecurityPolicy /
# PodSecurityStandards en Kubernetes).
RUN useradd --create-home --uid 1000 appuser
# Répertoire pour la base SQLite : à monter sur un PersistentVolume en k8s
# (sinon les données de collecte sont perdues à chaque redéploiement du pod).
RUN mkdir -p /data && chown -R appuser:appuser /data /app
VOLUME ["/data"]
ENV COST_DASHBOARD_DB=/data/cost_dashboard.db \
PYTHONUNBUFFERED=1
USER appuser
EXPOSE 8000
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s \
CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')" || exit 1
# Commande par défaut : lance le serveur web. Le CronJob de collecte
# surcharge 'command'/'args' au niveau du manifeste Kubernetes (voir plus haut).
CMD ["uvicorn", "api.main:app", "--host", "0.0.0.0", "--port", "8000", "--app-dir", "/app"]