# Dockerfile ORIGINAL — el que pesaba 1.58GB
FROM node:20 WORKDIR /app # Copiamos todo sin filtrar nada
COPY package*.json ./
RUN -weight: 500;">npm -weight: 500;">install COPY . . # Build del TS
RUN -weight: 500;">npm run build EXPOSE 3000
CMD ["node", "dist/index.js"]
# Dockerfile ORIGINAL — el que pesaba 1.58GB
FROM node:20 WORKDIR /app # Copiamos todo sin filtrar nada
COPY package*.json ./
RUN -weight: 500;">npm -weight: 500;">install COPY . . # Build del TS
RUN -weight: 500;">npm run build EXPOSE 3000
CMD ["node", "dist/index.js"]
# Dockerfile ORIGINAL — el que pesaba 1.58GB
FROM node:20 WORKDIR /app # Copiamos todo sin filtrar nada
COPY package*.json ./
RUN -weight: 500;">npm -weight: 500;">install COPY . . # Build del TS
RUN -weight: 500;">npm run build EXPOSE 3000
CMD ["node", "dist/index.js"]
# Dockerfile OPTIMIZADO — 186MB
# Stage 1: build
FROM node:20-alpine AS builder WORKDIR /app # Primero las dependencias para aprovechar cache de capas
COPY package*.json ./
RUN -weight: 500;">npm ci --include=dev # Copiamos fuente y compilamos
COPY tsconfig.json ./
COPY src/ ./src/
RUN -weight: 500;">npm run build # Stage 2: producción — solo lo que necesita correr
FROM node:20-alpine AS production WORKDIR /app # Solo dependencias de producción
COPY package*.json ./
RUN -weight: 500;">npm ci --only=production && -weight: 500;">npm cache clean --force # Solo el código compilado, no el fuente
COPY --from=builder /app/dist ./dist EXPOSE 3000
CMD ["node", "dist/index.js"]
# Dockerfile OPTIMIZADO — 186MB
# Stage 1: build
FROM node:20-alpine AS builder WORKDIR /app # Primero las dependencias para aprovechar cache de capas
COPY package*.json ./
RUN -weight: 500;">npm ci --include=dev # Copiamos fuente y compilamos
COPY tsconfig.json ./
COPY src/ ./src/
RUN -weight: 500;">npm run build # Stage 2: producción — solo lo que necesita correr
FROM node:20-alpine AS production WORKDIR /app # Solo dependencias de producción
COPY package*.json ./
RUN -weight: 500;">npm ci --only=production && -weight: 500;">npm cache clean --force # Solo el código compilado, no el fuente
COPY --from=builder /app/dist ./dist EXPOSE 3000
CMD ["node", "dist/index.js"]
# Dockerfile OPTIMIZADO — 186MB
# Stage 1: build
FROM node:20-alpine AS builder WORKDIR /app # Primero las dependencias para aprovechar cache de capas
COPY package*.json ./
RUN -weight: 500;">npm ci --include=dev # Copiamos fuente y compilamos
COPY tsconfig.json ./
COPY src/ ./src/
RUN -weight: 500;">npm run build # Stage 2: producción — solo lo que necesita correr
FROM node:20-alpine AS production WORKDIR /app # Solo dependencias de producción
COPY package*.json ./
RUN -weight: 500;">npm ci --only=production && -weight: 500;">npm cache clean --force # Solo el código compilado, no el fuente
COPY --from=builder /app/dist ./dist EXPOSE 3000
CMD ["node", "dist/index.js"]
# .dockerignore — todo lo que NO debe entrar
node_modules
dist
.-weight: 500;">git
.gitignore
*.md
.env*
.dockerignore
Dockerfile*
-weight: 500;">npm-debug.log*
# .dockerignore — todo lo que NO debe entrar
node_modules
dist
.-weight: 500;">git
.gitignore
*.md
.env*
.dockerignore
Dockerfile*
-weight: 500;">npm-debug.log*
# .dockerignore — todo lo que NO debe entrar
node_modules
dist
.-weight: 500;">git
.gitignore
*.md
.env*
.dockerignore
Dockerfile*
-weight: 500;">npm-debug.log*
# -weight: 500;">docker-compose.dev.yml — ANTES de mi cambio
services: api: build: context: . dockerfile: Dockerfile # Sin especificar target volumes: - ./src:/app/src # Hot reload via volumen command: -weight: 500;">npm run dev # ts-node-dev ports: - "3000:3000"
# -weight: 500;">docker-compose.dev.yml — ANTES de mi cambio
services: api: build: context: . dockerfile: Dockerfile # Sin especificar target volumes: - ./src:/app/src # Hot reload via volumen command: -weight: 500;">npm run dev # ts-node-dev ports: - "3000:3000"
# -weight: 500;">docker-compose.dev.yml — ANTES de mi cambio
services: api: build: context: . dockerfile: Dockerfile # Sin especificar target volumes: - ./src:/app/src # Hot reload via volumen command: -weight: 500;">npm run dev # ts-node-dev ports: - "3000:3000"
# -weight: 500;">docker-compose.dev.yml — CORREGIDO
services: api: build: context: . dockerfile: Dockerfile target: builder # Explícito: usá el stage con devDependencies volumes: - ./src:/app/src - ./tsconfig.json:/app/tsconfig.json command: -weight: 500;">npm run dev ports: - "3000:3000" environment: - NODE_ENV=development
# -weight: 500;">docker-compose.dev.yml — CORREGIDO
services: api: build: context: . dockerfile: Dockerfile target: builder # Explícito: usá el stage con devDependencies volumes: - ./src:/app/src - ./tsconfig.json:/app/tsconfig.json command: -weight: 500;">npm run dev ports: - "3000:3000" environment: - NODE_ENV=development
# -weight: 500;">docker-compose.dev.yml — CORREGIDO
services: api: build: context: . dockerfile: Dockerfile target: builder # Explícito: usá el stage con devDependencies volumes: - ./src:/app/src - ./tsconfig.json:/app/tsconfig.json command: -weight: 500;">npm run dev ports: - "3000:3000" environment: - NODE_ENV=development
# Dockerfile.dev — solo para desarrollo, sin ambigüedad
FROM node:20-alpine WORKDIR /app COPY package*.json ./
RUN -weight: 500;">npm ci # Todas las dependencias, incluyendo dev # El source lo monta el volumen de compose
# No copiamos nada más acá EXPOSE 3000
CMD ["-weight: 500;">npm", "run", "dev"]
# Dockerfile.dev — solo para desarrollo, sin ambigüedad
FROM node:20-alpine WORKDIR /app COPY package*.json ./
RUN -weight: 500;">npm ci # Todas las dependencias, incluyendo dev # El source lo monta el volumen de compose
# No copiamos nada más acá EXPOSE 3000
CMD ["-weight: 500;">npm", "run", "dev"]
# Dockerfile.dev — solo para desarrollo, sin ambigüedad
FROM node:20-alpine WORKDIR /app COPY package*.json ./
RUN -weight: 500;">npm ci # Todas las dependencias, incluyendo dev # El source lo monta el volumen de compose
# No copiamos nada más acá EXPOSE 3000
CMD ["-weight: 500;">npm", "run", "dev"]
# -weight: 500;">docker-compose.dev.yml — usando Dockerfile.dev explícitamente
services: api: build: context: . dockerfile: Dockerfile.dev # Sin ambigüedad posible volumes: - ./src:/app/src - ./tsconfig.json:/app/tsconfig.json ports: - "3000:3000"
# -weight: 500;">docker-compose.dev.yml — usando Dockerfile.dev explícitamente
services: api: build: context: . dockerfile: Dockerfile.dev # Sin ambigüedad posible volumes: - ./src:/app/src - ./tsconfig.json:/app/tsconfig.json ports: - "3000:3000"
# -weight: 500;">docker-compose.dev.yml — usando Dockerfile.dev explícitamente
services: api: build: context: . dockerfile: Dockerfile.dev # Sin ambigüedad posible volumes: - ./src:/app/src - ./tsconfig.json:/app/tsconfig.json ports: - "3000:3000"
# Si tenés problemas con binarios nativos en Alpine,
# usá slim en lugar de alpine — menos dramático pero más seguro
FROM node:20-slim AS production
# Si tenés problemas con binarios nativos en Alpine,
# usá slim en lugar de alpine — menos dramático pero más seguro
FROM node:20-slim AS production
# Si tenés problemas con binarios nativos en Alpine,
# usá slim en lugar de alpine — menos dramático pero más seguro
FROM node:20-slim AS production
# MAL — invalida el cache de dependencias con cada cambio de código
COPY . .
RUN -weight: 500;">npm -weight: 500;">install # BIEN — el cache de -weight: 500;">npm -weight: 500;">install sobrevive cambios en el source
COPY package*.json ./
RUN -weight: 500;">npm -weight: 500;">install
COPY . .
# MAL — invalida el cache de dependencias con cada cambio de código
COPY . .
RUN -weight: 500;">npm -weight: 500;">install # BIEN — el cache de -weight: 500;">npm -weight: 500;">install sobrevive cambios en el source
COPY package*.json ./
RUN -weight: 500;">npm -weight: 500;">install
COPY . .
# MAL — invalida el cache de dependencias con cada cambio de código
COPY . .
RUN -weight: 500;">npm -weight: 500;">install # BIEN — el cache de -weight: 500;">npm -weight: 500;">install sobrevive cambios en el source
COPY package*.json ./
RUN -weight: 500;">npm -weight: 500;">install
COPY . .
# Después de instalar, limpiá el cache — ahorra 50-100MB fácil
RUN -weight: 500;">npm ci --only=production && -weight: 500;">npm cache clean --force
# Después de instalar, limpiá el cache — ahorra 50-100MB fácil
RUN -weight: 500;">npm ci --only=production && -weight: 500;">npm cache clean --force
# Después de instalar, limpiá el cache — ahorra 50-100MB fácil
RUN -weight: 500;">npm ci --only=production && -weight: 500;">npm cache clean --force
# Instalar dive
-weight: 500;">brew -weight: 500;">install dive # macOS
# o
-weight: 500;">docker run --rm -it -v /var/run/-weight: 500;">docker.sock:/var/run/-weight: 500;">docker.sock wagoodman/dive nombre-imagen
# Instalar dive
-weight: 500;">brew -weight: 500;">install dive # macOS
# o
-weight: 500;">docker run --rm -it -v /var/run/-weight: 500;">docker.sock:/var/run/-weight: 500;">docker.sock wagoodman/dive nombre-imagen
# Instalar dive
-weight: 500;">brew -weight: 500;">install dive # macOS
# o
-weight: 500;">docker run --rm -it -v /var/run/-weight: 500;">docker.sock:/var/run/-weight: 500;">docker.sock wagoodman/dive nombre-imagen - ¿Corré -weight: 500;">docker-compose up y modificé un archivo en /src? ¿Se reflejó el cambio?
- ¿Hay variables de entorno que el stage de producción no tiene?
- ¿Los health checks funcionan igual?
- ¿Las rutas de archivos estáticos son las mismas?