# Exemplo 2: Multi-stage build em Python
# Tecnica que separa a fase de "build" da fase de "runtime" para gerar imagens
# menores e mais seguras. O estagio "builder" e descartado da imagem final.

# ---------- ESTAGIO 1: BUILDER ----------

# Primeiro estagio nomeado "builder" - sera descartado no final da build.
FROM python:3.12-slim AS builder

# Diretorio de trabalho do builder.
WORKDIR /app

# Instala o compilador GCC (necessario para compilar wheels nativos como cryptography, numpy, etc).
# Em seguida limpa o cache do apt para nao inflar a camada.
RUN apt-get update \
    && apt-get install -y --no-install-recommends gcc \
    && rm -rf /var/lib/apt/lists/*

# Copia apenas o requirements para aproveitar cache.
COPY requirements.txt .

# Instala em modo --user para que tudo va para /root/.local
# (assim podemos copiar APENAS isso para o estagio final).
RUN pip install --user --no-cache-dir -r requirements.txt

# ---------- ESTAGIO 2: RUNTIME ----------

# Segundo estagio: imagem final, mais limpa (sem gcc, sem cache, sem ferramentas de build).
FROM python:3.12-slim

# Diretorio de trabalho da imagem final.
WORKDIR /app

# Copia APENAS as dependencias instaladas do estagio anterior.
COPY --from=builder /root/.local /root/.local

# Copia o codigo da aplicacao.
COPY . .

# Adiciona o diretorio de binarios do pip-user ao PATH.
ENV PATH=/root/.local/bin:$PATH

# Cria um usuario nao-root chamado "appuser" para rodar a app (boa pratica de seguranca).
RUN useradd --create-home appuser

# Troca para o usuario nao-privilegiado.
USER appuser

# Documenta a porta da aplicacao.
EXPOSE 8000

# Comando padrao do container.
CMD ["python", "app.py"]
