Source profileQuality 59/100Review permissions

affaan-m/ECC/docs/es/skills/docker-patterns/SKILL.md

docker-patterns

Patrones de Docker y Docker Compose para desarrollo local, seguridad de contenedores, networking, estrategias de volúmenes y orquestación de múltiples servicios.

Source repository stars
234,327
Declared platforms
0
Static risk flags
2
Last source update
2026-07-27
Source checked
2026-07-28

Decision brief

What it does—and where it fits

Buenas prácticas de Docker y Docker Compose para desarrollo en contenedores.

Best for

    Not for

    • Tasks that require unconfirmed production actions or broad system permissions.
    • Environments where the pinned source and install steps cannot be inspected.

    Compatibility matrix

    Platform support, with evidence labels

    PlatformStatusEvidenceWhat to check
    CodexNot declaredNo explicit evidencePortability before use
    Claude CodeNot declaredNo explicit evidencePortability before use
    CursorNot declaredNo explicit evidencePortability before use
    Gemini CLINot declaredNo explicit evidencePortability before use
    Open the compatibility checker

    Installation

    Inspect first. Install second.

    The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.

    Source-detected install commandSource
    npx skills add https://github.com/affaan-m/ECC --skill "docs/es/skills/docker-patterns"
    Safe inspection promptEditorial

    Inspect the Agent Skill "docker-patterns" from https://github.com/affaan-m/ECC/blob/4e973d3eaf92d97f8d2e2d8abb39d8bdc8711b38/docs/es/skills/docker-patterns/SKILL.md at commit 4e973d3eaf92d97f8d2e2d8abb39d8bdc8711b38. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.

    Workflow

    What the source asks the agent to do

    1. 01

      Cuándo Activar

      Configurar Docker Compose para desarrollo local

      Configurar Docker Compose para desarrollo localDiseñar arquitecturas de múltiples contenedoresResolver problemas de networking o volúmenes de contenedores
    2. 02

      Docker Compose para Desarrollo Local

      Review the “Docker Compose para Desarrollo Local” section in the pinned source before continuing.

      Review and apply the “Docker Compose para Desarrollo Local” source section.
    3. 03

      Stack Estándar de Aplicación Web

      Review the “Stack Estándar de Aplicación Web” section in the pinned source before continuing.

      Review and apply the “Stack Estándar de Aplicación Web” source section.
    4. 04

      docker-compose.yml

      services: app: build: context: . target: dev Usar etapa dev del Dockerfile multi-stage ports: - "3000:3000" volumes: - .:/app Bind mount para hot reload - /app/nodemodules Volumen anónimo -- preserva deps del contenedor environment: - DATABASEURL=postgres://postgres:postgres@db:…

      "3000:3000".:/app Bind mount para hot reload/app/nodemodules Volumen anónimo -- preserva deps del contenedor
    5. 05

      Dockerfile de Desarrollo vs Producción

      Review the “Dockerfile de Desarrollo vs Producción” section in the pinned source before continuing.

      Review and apply the “Dockerfile de Desarrollo vs Producción” source section.

    Permission review

    Static risk signals and limitations

    Network access

    medium · line 109

    The documentation includes network, browsing, or remote request actions.

    HEALTHCHECK --interval=30s --timeout=3s CMD wget -qO- http://localhost:3000/health || exit 1

    Runs scripts

    medium · line 140

    The documentation asks the agent to run terminal commands or scripts.

    docker compose up

    Runs scripts

    medium · line 143

    The documentation asks the agent to run terminal commands or scripts.

    docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d

    Network access

    medium · line 331

    The documentation includes network, browsing, or remote request actions.

    docker compose exec app wget -qO- http://api:3000/health

    Evidence record

    Why each signal appears

    EvidenceSourceComputedTestedEditorial
    SignalValueEvidence typeMeaning
    Quality score59/100ComputedDocumentation, specificity, maintenance, and trust rules
    Repository stars234,327SourceRepository attention, not individual Skill quality
    Compatibility0 platformsSourceDeclared in the catalog source record
    Usage guideautomated source guideEditorialGenerated or reviewed according to the visible evidence level

    Pinned source

    Provenance and original SKILL.md

    Repository
    affaan-m/ECC
    Skill path
    docs/es/skills/docker-patterns/SKILL.md
    Commit
    4e973d3eaf92d97f8d2e2d8abb39d8bdc8711b38
    License
    MIT
    Collected
    2026-07-28
    Default branch
    main
    View the original SKILL.md

    Patrones Docker

    Buenas prácticas de Docker y Docker Compose para desarrollo en contenedores.

    Cuándo Activar

    • Configurar Docker Compose para desarrollo local
    • Diseñar arquitecturas de múltiples contenedores
    • Resolver problemas de networking o volúmenes de contenedores
    • Revisar Dockerfiles para seguridad y tamaño
    • Migrar de desarrollo local a flujo de trabajo en contenedores

    Docker Compose para Desarrollo Local

    Stack Estándar de Aplicación Web

    # docker-compose.yml
    services:
      app:
        build:
          context: .
          target: dev                     # Usar etapa dev del Dockerfile multi-stage
        ports:
          - "3000:3000"
        volumes:
          - .:/app                        # Bind mount para hot reload
          - /app/node_modules             # Volumen anónimo -- preserva deps del contenedor
        environment:
          - DATABASE_URL=postgres://postgres:postgres@db:5432/app_dev
          - REDIS_URL=redis://redis:6379/0
          - NODE_ENV=development
        depends_on:
          db:
            condition: service_healthy
          redis:
            condition: service_started
        command: npm run dev
    
      db:
        image: postgres:16-alpine
        ports:
          - "5432:5432"
        environment:
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD: postgres
          POSTGRES_DB: app_dev
        volumes:
          - pgdata:/var/lib/postgresql/data
          - ./scripts/init-db.sql:/docker-entrypoint-initdb.d/init.sql
        healthcheck:
          test: ["CMD-SHELL", "pg_isready -U postgres"]
          interval: 5s
          timeout: 3s
          retries: 5
    
      redis:
        image: redis:7-alpine
        ports:
          - "6379:6379"
        volumes:
          - redisdata:/data
    
      mailpit:                            # Pruebas de email locales
        image: axllent/mailpit
        ports:
          - "8025:8025"                   # Web UI
          - "1025:1025"                   # SMTP
    
    volumes:
      pgdata:
      redisdata:
    

    Dockerfile de Desarrollo vs Producción

    # Etapa: dependencias
    FROM node:22-alpine AS deps
    WORKDIR /app
    COPY package.json package-lock.json ./
    RUN npm ci
    
    # Etapa: dev (hot reload, herramientas de debug)
    FROM node:22-alpine AS dev
    WORKDIR /app
    COPY --from=deps /app/node_modules ./node_modules
    COPY . .
    EXPOSE 3000
    CMD ["npm", "run", "dev"]
    
    # Etapa: build
    FROM node:22-alpine AS build
    WORKDIR /app
    COPY --from=deps /app/node_modules ./node_modules
    COPY . .
    RUN npm run build && npm prune --production
    
    # Etapa: producción (imagen mínima)
    FROM node:22-alpine AS production
    WORKDIR /app
    RUN addgroup -g 1001 -S appgroup && adduser -S appuser -u 1001
    USER appuser
    COPY --from=build --chown=appuser:appgroup /app/dist ./dist
    COPY --from=build --chown=appuser:appgroup /app/node_modules ./node_modules
    COPY --from=build --chown=appuser:appgroup /app/package.json ./
    ENV NODE_ENV=production
    EXPOSE 3000
    HEALTHCHECK --interval=30s --timeout=3s CMD wget -qO- http://localhost:3000/health || exit 1
    CMD ["node", "dist/server.js"]
    

    Archivos de Override

    # docker-compose.override.yml (carga automática, configuración solo para dev)
    services:
      app:
        environment:
          - DEBUG=app:*
          - LOG_LEVEL=debug
        ports:
          - "9229:9229"                   # Debugger de Node.js
    
    # docker-compose.prod.yml (explícito para producción)
    services:
      app:
        build:
          target: production
        restart: always
        deploy:
          resources:
            limits:
              cpus: "1.0"
              memory: 512M
    
    # Desarrollo (carga override automáticamente)
    docker compose up
    
    # Producción
    docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
    

    Networking

    Descubrimiento de Servicios

    Los servicios en la misma red de Compose se resuelven por nombre de servicio:

    # Desde el contenedor "app":
    postgres://postgres:postgres@db:5432/app_dev    # "db" resuelve al contenedor db
    redis://redis:6379/0                             # "redis" resuelve al contenedor redis
    

    Redes Personalizadas

    services:
      frontend:
        networks:
          - frontend-net
    
      api:
        networks:
          - frontend-net
          - backend-net
    
      db:
        networks:
          - backend-net              # Solo accesible desde api, no desde frontend
    
    networks:
      frontend-net:
      backend-net:
    

    Exponer Solo Lo Necesario

    services:
      db:
        ports:
          - "127.0.0.1:5432:5432"   # Solo accesible desde el host, no desde la red
        # Omitir ports completamente en producción -- accesible solo dentro de la red Docker
    

    Estrategias de Volúmenes

    volumes:
      # Volumen nombrado: persiste entre reinicios de contenedor, gestionado por Docker
      pgdata:
    
      # Bind mount: mapea directorio del host al contenedor (para desarrollo)
      # - ./src:/app/src
    
      # Volumen anónimo: preserva contenido generado por el contenedor del bind mount override
      # - /app/node_modules
    

    Patrones Comunes

    services:
      app:
        volumes:
          - .:/app                   # Código fuente (bind mount para hot reload)
          - /app/node_modules        # Proteger node_modules del contenedor del host
          - /app/.next               # Proteger caché de build
    
      db:
        volumes:
          - pgdata:/var/lib/postgresql/data          # Datos persistentes
          - ./scripts/init.sql:/docker-entrypoint-initdb.d/init.sql  # Scripts de init
    

    Seguridad de Contenedores

    Hardening de Dockerfile

    # 1. Usar etiquetas específicas (nunca :latest)
    FROM node:22.12-alpine3.20
    
    # 2. Ejecutar como usuario no-root
    RUN addgroup -g 1001 -S app && adduser -S app -u 1001
    USER app
    
    # 3. Eliminar capabilities (en compose)
    # 4. Sistema de archivos raíz de solo lectura donde sea posible
    # 5. Sin secretos en capas de imagen
    

    Seguridad de Compose

    services:
      app:
        security_opt:
          - no-new-privileges:true
        read_only: true
        tmpfs:
          - /tmp
          - /app/.cache
        cap_drop:
          - ALL
        cap_add:
          - NET_BIND_SERVICE          # Solo si se vincula a puertos < 1024
    

    Gestión de Secretos

    # BIEN: Usar variables de entorno (inyectadas en tiempo de ejecución)
    services:
      app:
        env_file:
          - .env                     # Nunca hacer commit de .env a git
        environment:
          - API_KEY                  # Hereda del entorno del host
    
    # BIEN: Docker secrets (modo Swarm)
    secrets:
      db_password:
        file: ./secrets/db_password.txt
    
    services:
      db:
        secrets:
          - db_password
    
    # MAL: Hardcodeado en imagen
    # ENV API_KEY=sk-proj-xxxxx      # NUNCA HACER ESTO
    

    .dockerignore

    node_modules
    .git
    .env
    .env.*
    dist
    coverage
    *.log
    .next
    .cache
    docker-compose*.yml
    Dockerfile*
    README.md
    tests/
    

    Depuración

    Comandos Comunes

    # Ver logs
    docker compose logs -f app           # Seguir logs de app
    docker compose logs --tail=50 db     # Últimas 50 líneas de db
    
    # Ejecutar comandos en contenedor en ejecución
    docker compose exec app sh           # Shell en app
    docker compose exec db psql -U postgres  # Conectar a postgres
    
    # Inspeccionar
    docker compose ps                     # Servicios en ejecución
    docker compose top                    # Procesos en cada contenedor
    docker stats                          # Uso de recursos
    
    # Reconstruir
    docker compose up --build             # Reconstruir imágenes
    docker compose build --no-cache app   # Forzar reconstrucción completa
    
    # Limpiar
    docker compose down                   # Detener y eliminar contenedores
    docker compose down -v                # También eliminar volúmenes (DESTRUCTIVO)
    docker system prune                   # Eliminar imágenes/contenedores no usados
    

    Depurar Problemas de Red

    # Verificar resolución DNS dentro del contenedor
    docker compose exec app nslookup db
    
    # Verificar conectividad
    docker compose exec app wget -qO- http://api:3000/health
    
    # Inspeccionar red
    docker network ls
    docker network inspect <project>_default
    

    Anti-Patrones

    # MAL: Usar docker compose en producción sin orquestación
    # Usar Kubernetes, ECS o Docker Swarm para cargas de trabajo de múltiples contenedores en producción
    
    # MAL: Almacenar datos en contenedores sin volúmenes
    # Los contenedores son efímeros -- todos los datos se pierden al reiniciar sin volúmenes
    
    # MAL: Ejecutar como root
    # Siempre crear y usar un usuario no-root
    
    # MAL: Usar etiqueta :latest
    # Fijar a versiones específicas para builds reproducibles
    
    # MAL: Un contenedor gigante con todos los servicios
    # Separar responsabilidades: un proceso por contenedor
    
    # MAL: Poner secretos en docker-compose.yml
    # Usar archivos .env (en .gitignore) o Docker secrets
    

    Alternatives

    Compare before choosing