Docker¶
Objetivo¶
Definir o padrão oficial de containerização, verificado contra o Dockerfile/docker-compose.yml reais dos produtos (referência: CoreFlow CRM).
Dockerfile — build multi-stage¶
FROM python:3.12-slim AS builder
ENV PYTHONDONTWRITEBYTECODE=1 PYTHONUNBUFFERED=1
WORKDIR /app
RUN apt-get update && apt-get install -y --no-install-recommends libpq-dev gcc \
&& rm -rf /var/lib/apt/lists/*
COPY requirements.txt .
RUN pip install --no-cache-dir --prefix=/install -r requirements.txt
FROM python:3.12-slim
ENV PYTHONDONTWRITEBYTECODE=1 PYTHONUNBUFFERED=1 TZ=America/Sao_Paulo
WORKDIR /app
RUN apt-get update && apt-get install -y --no-install-recommends libpq5 curl \
&& rm -rf /var/lib/apt/lists/*
COPY --from=builder /install /usr/local
RUN groupadd -r appuser && useradd -r -g appuser -d /home/appuser -m appuser
COPY --chown=appuser:appuser . .
USER appuser
EXPOSE 8007
CMD ["gunicorn", "config.wsgi:application", "--bind", "0.0.0.0:8007", "--workers", "3", "--timeout", "120"]
Pontos obrigatórios deste padrão:
- Multi-stage — dependências de build (
gcc,libpq-dev) não vão para a imagem final. - Usuário não-root (
appuser) — a aplicação nunca roda como root no container. TZ=America/Sao_Paulosempre definido na imagem final.- Gunicorn, nunca
runserver, como processo da aplicação em produção. - Porta exposta é a porta real do produto (cada produto usa uma porta própria para evitar colisão na mesma VPS — ex.:
8007no CRM).
docker-compose.yml — serviços de apoio¶
services:
postgres:
image: postgres:16-alpine
environment:
POSTGRES_DB: ${DB_NAME}
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
TZ: America/Sao_Paulo
volumes:
- postgres_data:/var/lib/postgresql/data
networks: [internal]
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USER} -d ${DB_NAME}"]
redis:
image: redis:7-alpine
networks: [internal]
rabbitmq:
image: rabbitmq:3.13-management-alpine
environment:
RABBITMQ_DEFAULT_USER: ${RABBITMQ_USER}
RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASS}
networks: [internal]
- Redis — cache e, em alguns produtos, broker do Celery.
- RabbitMQ — broker do Celery nos produtos que o adotam (ex.: CRM) em vez de Redis.
- Todo serviço tem
healthcheckerestart: unless-stopped. - Portas de management/debug (ex.: RabbitMQ
15672) são expostas apenas em desenvolvimento — removidas em produção.
Comandos padrão¶
Sempre docker compose (v2, sem hífen) — nunca docker-compose.
Objetivo Final¶
Toda imagem de produto CoreFlow deve ser pequena (multi-stage), segura (usuário não-root) e operar com o mesmo conjunto previsível de serviços de apoio (Postgres, cache/broker), independente do produto.