Skip to main content

Dockerizar um app Django com Postgres e Redis

Devin escreve um Dockerfile multi-stage, um docker-compose.yml com Django, PostgreSQL e Redis, depois faz o build e executa a stack para verificar se tudo funciona.
AuthorCognition
CategoryDesenvolvimento de funcionalidades
1

(Opcional) Defina o escopo do projeto usando o Ask Devin

Se você não tem certeza de quais serviços seu app Django depende ou de como o projeto é estruturado, use o Ask Devin para investigar primeiro:Você também pode iniciar uma sessão do Devin diretamente a partir do Ask Devin, e tudo o que ele tiver aprendido será mantido como contexto.
2

Forneça ao Devin seu projeto Django e o arquivo requirements.txt

Aponte o Devin para o projeto Django que você quer conteinerizar e mencione qualquer requisito específico — preferências de imagem base, serviços dos quais o app depende ou restrições de tamanho da imagem. O Devin lê seu requirements.txt ou pyproject.toml para cuidar do restante.
3

Devin analisa e desenvolve

Devin lê seu projeto Django e arquivos de dependência para entender o processo de build e, em seguida, cria a configuração do Docker:
  1. Lê arquivos de dependência — Analisa requirements.txt ou pyproject.toml, identifica Django, psycopg2, redis, celery e gunicorn
  2. Escreve o Dockerfile — Cria um build multiestágio que instala as dependências em um estágio de build e copia o ambiente virtual para uma imagem de runtime mínima python:3.12-slim
# ---- Builder ----
FROM python:3.12-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN python -m venv /opt/venv \
    && /opt/venv/bin/pip install --no-cache-dir -r requirements.txt

# ---- Runtime ----
FROM python:3.12-slim
RUN groupadd -r django && useradd -r -g django django
COPY --from=builder /opt/venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
WORKDIR /app
COPY src/ .
RUN python manage.py collectstatic --noinput
EXPOSE 8000
USER django
CMD ["gunicorn", "config.wsgi:application", "--bind", "0.0.0.0:8000", "--workers", "3"]
  1. Cria o docker-compose.yml — Adiciona Django, PostgreSQL, Redis e um worker do Celery com verificações de integridade, volumes e uma rede compartilhada
services:
  web:
    build: .
    ports:
      - "8000:8000"
    env_file: .env
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy
    healthcheck:
      test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/api/health/')"]
      interval: 10s
      retries: 3

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: app_db
      POSTGRES_USER: app_user
      POSTGRES_PASSWORD: app_pass
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U app_user -d app_db"]
      interval: 5s
      retries: 5

  redis:
    image: redis:7-alpine
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      retries: 5

  celery:
    build: .
    command: celery -A config worker -l info
    env_file: .env
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy

volumes:
  pgdata:
  1. Adiciona .dockerignore — Exclui arquivos que não pertencem ao contexto de build (__pycache__, .git, tests/, docs/, *.pyc)
  2. Executa docker compose up --build — Faz o build da imagem e inicia todos os serviços no terminal do Devin
  3. Verifica o aplicativo — Executa um curl em /api/health/ para confirmar que o Django inicia corretamente, conecta ao PostgreSQL e acessa o Redis
4

Guie a sessão com comandos de barra (/)

Use comandos com barra durante a sessão para direcionar o fluxo de trabalho do Devin:
  • /plan — Peça ao Devin para descrever sua abordagem antes de escrever qualquer configuração Docker. Revise o plano e sugira alterações.
  • /test — Diga ao Devin para reconstruir e revalidar a stack de contêineres. Use isso após cada alteração para detectar problemas logo no início.
  • /review — Peça ao Devin para revisar seu próprio Dockerfile e a configuração do Docker Compose em busca de problemas de segurança, tamanho da imagem e melhores práticas antes de abrir o PR.
5

Validar e iterar

Quando o Devin abrir o PR, revise os arquivos gerados. Algumas solicitações comuns:
6

Revise o PR com o Devin Review

Quando Devin abrir o PR, use o Devin Review para revisar a configuração do Docker. O Devin Review pode identificar problemas de segurança (como execução como root, segredos expostos), ausência de boas práticas importantes (falta de .dockerignore, ausência de health checks) e inconsistências em relação à sua infraestrutura existente.