Skip to content
Back to skills

Create Multistage Dockerfile

ASecurity

Crear Dockerfiles multi-etapa que separan las dependencias de compilación de la imagen de producción para obtener imágenes más pequeñas, seguras y eficientes. Cubrir patrones para Go, Rust, Java, Node.js y Python con compilación de artefactos, prueba, y empaquetado final.

  • 31 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added May 29, 2026
ai-agentspythonrustgojavabashnodedockergitsecurity

Security analysis

A100/100

Scanned May 29, 2026

npx -y skills add pjt222/agent-almanac --skill create-multistage-dockerfile --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Create Multistage Dockerfile?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Create Multistage Dockerfile
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/pjt222-create-multistage-dockerfile/badge)](https://www.skillsdirectory.com/skills/pjt222-create-multistage-dockerfile)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: create-multistage-dockerfile
locale: es
source_locale: en
source_commit: 6f65f316
translator: claude-sonnet-4-6
translation_date: 2026-03-16
description: >
  Crear Dockerfiles multi-etapa que separan las dependencias de compilación de la imagen
  de producción para obtener imágenes más pequeñas, seguras y eficientes. Cubrir patrones
  para Go, Rust, Java, Node.js y Python con compilación de artefactos, prueba, y
  empaquetado final.
license: MIT
allowed-tools: Read Write Edit Bash Grep Glob
metadata:
  author: Philipp Thoss
  version: "1.0"
  domain: containerization
  complexity: intermediate
  language: multi
  tags: docker, multi-stage, build, optimization, security
---

# Crear Dockerfile Multi-Etapa

Crear Dockerfiles multi-etapa para separar compilación de producción y obtener imágenes mínimas.

## Cuándo Usar

- Las imágenes Docker de producción son demasiado grandes
- Necesitando separar herramientas de compilación de la imagen final
- Compilando binarios estáticos (Go, Rust) para imágenes minimales
- Ejecutando pruebas en la compilación sin incluirlas en producción
- Reduciendo la superficie de ataque eliminando herramientas innecesarias

## Entradas

- **Requerido**: Código fuente de la aplicación
- **Requerido**: Proceso de compilación del proyecto
- **Opcional**: Suite de pruebas para ejecutar durante la compilación
- **Opcional**: Requisitos de imagen base para producción

## Procedimiento

### Paso 1: Diseñar las Etapas de Compilación

Identificar las etapas necesarias según el lenguaje.

```dockerfile
# Patrón general de 3 etapas
# Etapa 1: Dependencias
# Etapa 2: Compilación
# Etapa 3: Producción (imagen final)
```

**Esperado:** Separación clara entre etapas de compilación y producción.

**En caso de fallo:** Comenzar con 2 etapas (compilación + producción) y agregar más si es necesario.

### Paso 2: Implementar para Lenguajes Compilados (Go)

```dockerfile
# Etapa de compilación
FROM golang:1.21-alpine AS builder
RUN apk add --no-cache git ca-certificates
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-w -s" -o /server .

# Etapa de producción
FROM scratch
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
COPY --from=builder /server /server
ENTRYPOINT ["/server"]
```

Para **Rust**:

```dockerfile
FROM rust:1.74-alpine AS builder
WORKDIR /app
COPY Cargo.toml Cargo.lock ./
RUN mkdir src && echo "fn main() {}" > src/main.rs
RUN cargo build --release
COPY src ./src
RUN cargo build --release

FROM alpine:3.18
COPY --from=builder /app/target/release/myapp /usr/local/bin/myapp
CMD ["myapp"]
```

**Esperado:** La imagen final contiene solo el binario y dependencias mínimas de runtime.

**En caso de fallo:** Verificar que el binario es estáticamente enlazado (para `scratch`), incluir certificados SSL si se necesita HTTPS.

### Paso 3: Implementar para Lenguajes Interpretados (Node.js)

```dockerfile
# Etapa de dependencias
FROM node:20-alpine AS deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --production

# Etapa de compilación
FROM node:20-alpine AS builder
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build

# Etapa de producción
FROM node:20-alpine
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
COPY package.json .
USER appuser
EXPOSE 3000
CMD ["node", "dist/index.js"]
```

**Esperado:** La imagen final no contiene devDependencies, archivos fuente ni herramientas de compilación.

**En caso de fallo:** Verificar que todos los archivos necesarios se copian desde las etapas correctas, probar la imagen final con todas las funcionalidades.

### Paso 4: Agregar Etapa de Pruebas

```dockerfile
FROM node:20-alpine AS builder
WORKDIR /app
COPY . .
RUN npm ci
RUN npm run build

# Etapa de pruebas (no produce imagen, pero falla la compilación si las pruebas fallan)
FROM builder AS tester
RUN npm test

# Etapa de producción (solo se alcanza si las pruebas pasan)
FROM node:20-alpine
COPY --from=builder /app/dist ./dist
CMD ["node", "dist/index.js"]
```

```bash
# Compilar hasta la etapa de pruebas
docker build --target tester -t mi-app:test .

# Compilar imagen de producción (ejecuta pruebas automáticamente)
docker build -t mi-app:latest .
```

**Esperado:** Las pruebas se ejecutan durante la compilación, la imagen de producción solo se crea si las pruebas pasan.

**En caso de fallo:** Usar `--target` para compilar etapas individuales y depurar problemas.

## Validación

- [ ] La imagen final es significativamente más pequeña que una compilación de una sola etapa
- [ ] No se incluyen herramientas de compilación en la imagen de producción
- [ ] Las pruebas se ejecutan durante la compilación
- [ ] La aplicación funciona correctamente en la imagen final
- [ ] Las capas de caché funcionan eficientemente entre etapas

## Errores Comunes

- **Copiar demasiado en la etapa final**: Solo copiar artefactos necesarios con `COPY --from=`.
- **No separar dependencias de compilación**: Las devDependencies no deben estar en la imagen final.
- **Olvidar certificados SSL**: Las imágenes `scratch` no tienen certificados; copiarlos explícitamente.
- **Caché de dependencias ineficiente**: Copiar archivos de bloqueo antes del código fuente en cada etapa.
- **No nombrar las etapas**: Usar `AS nombre` para referencia clara en lugar de índices numéricos.

## Habilidades Relacionadas

- `create-dockerfile` - Patrones base de Dockerfile
- `optimize-docker-build-cache` - Estrategias avanzadas de caché
- `create-r-dockerfile` - Dockerfiles específicos para R

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…