Docker

Docker Compose completo, servicos de infraestrutura e Dockerfiles multi-stage.

O PlazerCLI gera um docker-compose.yml completo com todos os servicos de infraestrutura necessarios para o projeto. Os servicos sao adicionados automaticamente com base nas features selecionadas.

docker-compose.yml completo

Exemplo de um projeto com todas as features habilitadas:

# docker-compose.yml
version: '3.8'

services:
  # Banco de dados
  postgres:
    image: postgres:16-alpine
    container_name: ${PROJECT_NAME}-postgres
    restart: unless-stopped
    ports:
      - '5432:5432'
    environment:
      POSTGRES_USER: ${DB_USER:-postgres}
      POSTGRES_PASSWORD: ${DB_PASSWORD:-postgres}
      POSTGRES_DB: ${DB_NAME:-app}
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -U postgres']
      interval: 10s
      timeout: 5s
      retries: 5

  # Cache e filas
  redis:
    image: redis:7-alpine
    container_name: ${PROJECT_NAME}-redis
    restart: unless-stopped
    ports:
      - '6379:6379'
    volumes:
      - redis_data:/data
    command: redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru
    healthcheck:
      test: ['CMD', 'redis-cli', 'ping']
      interval: 10s
      timeout: 5s
      retries: 5

  # Object storage
  minio:
    image: minio/minio:latest
    container_name: ${PROJECT_NAME}-minio
    restart: unless-stopped
    ports:
      - '9000:9000'
      - '9001:9001'
    environment:
      MINIO_ROOT_USER: minioadmin
      MINIO_ROOT_PASSWORD: minioadmin
    volumes:
      - minio_data:/data
    command: server /data --console-address ":9001"

  # Message broker (se RabbitMQ selecionado)
  rabbitmq:
    image: rabbitmq:3-management-alpine
    container_name: ${PROJECT_NAME}-rabbitmq
    restart: unless-stopped
    ports:
      - '5672:5672'
      - '15672:15672'
    environment:
      RABBITMQ_DEFAULT_USER: guest
      RABBITMQ_DEFAULT_PASS: guest
    volumes:
      - rabbitmq_data:/var/lib/rabbitmq

volumes:
  postgres_data:
  redis_data:
  minio_data:
  rabbitmq_data:

Servicos por feature

O PlazerCLI adiciona servicos condicionalmente:

Feature selecionadaServico adicionado
PostgreSQLpostgres:16-alpine
MySQLmysql:8
MongoDBmongo:7
Redis / BullMQ / Rate Limitingredis:7-alpine
MinIOminio/minio:latest
RabbitMQrabbitmq:3-management-alpine

Dockerfiles multi-stage

Para deploy, o PlazerCLI gera Dockerfiles otimizados com multi-stage build:

# apps/api/Dockerfile
FROM node:20-alpine AS base
RUN corepack enable && corepack prepare pnpm@9 --activate
WORKDIR /app

FROM base AS deps
COPY pnpm-lock.yaml pnpm-workspace.yaml package.json ./
COPY apps/api/package.json ./apps/api/
RUN pnpm install --frozen-lockfile --filter api

FROM base AS builder
COPY --from=deps /app/node_modules ./node_modules
COPY --from=deps /app/apps/api/node_modules ./apps/api/node_modules
COPY . .
RUN pnpm run --filter api build
RUN pnpm prune --prod --filter api

FROM node:20-alpine AS runner
WORKDIR /app
RUN addgroup --system --gid 1001 nodejs && adduser --system --uid 1001 app
COPY --from=builder --chown=app:nodejs /app/apps/api/dist ./dist
COPY --from=builder --chown=app:nodejs /app/apps/api/node_modules ./node_modules
COPY --from=builder --chown=app:nodejs /app/apps/api/package.json ./
USER app
EXPOSE 3001
ENV NODE_ENV=production
CMD ["node", "dist/main.js"]
# apps/web/Dockerfile (Next.js)
FROM node:20-alpine AS base
RUN corepack enable && corepack prepare pnpm@9 --activate
WORKDIR /app

FROM base AS deps
COPY pnpm-lock.yaml pnpm-workspace.yaml package.json ./
COPY apps/web/package.json ./apps/web/
RUN pnpm install --frozen-lockfile --filter web

FROM base AS builder
COPY --from=deps /app/node_modules ./node_modules
COPY --from=deps /app/apps/web/node_modules ./apps/web/node_modules
COPY . .
RUN pnpm run --filter web build

FROM node:20-alpine AS runner
WORKDIR /app
RUN addgroup --system --gid 1001 nodejs && adduser --system --uid 1001 nextjs
COPY --from=builder /app/apps/web/.next/standalone ./
COPY --from=builder /app/apps/web/.next/static ./.next/static
COPY --from=builder /app/apps/web/public ./public
USER nextjs
EXPOSE 3000
ENV PORT=3000 NODE_ENV=production
CMD ["node", "server.js"]

Comandos uteis

# Subir toda a infra
docker compose up -d

# Ver logs de um servico
docker compose logs -f postgres

# Parar tudo
docker compose down

# Parar e remover volumes (CUIDADO: apaga dados)
docker compose down -v

# Rebuild forcado
docker compose build --no-cache

# Build e rodar a API em Docker
docker compose -f docker-compose.prod.yml up -d --build