Pular para conteúdo

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_Paulo sempre 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.: 8007 no 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 healthcheck e restart: unless-stopped.
  • Portas de management/debug (ex.: RabbitMQ 15672) são expostas apenas em desenvolvimento — removidas em produção.

Comandos padrão

docker compose up -d
docker compose logs -f <service>
docker compose build --no-cache

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.