Cuando las instrucciones en un Dockerfile no están ordenadas eficientemente, cada cambio en el código fuente puede invalidar la caché de capas innecesariamente, resultando en builds más lentos.
Organizar las instrucciones de menos a más cambiantes para aprovechar el sistema de caché por capas de Docker.
FROM node:14
WORKDIR /app
COPY . .
RUN npm install
CMD ["npm", "start"]
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]
- Docker construye imágenes capa por capa
- Cada instrucción crea una nueva capa
- Las capas se cachean y se reutilizan si no hay cambios
- Si una capa cambia, todas las capas siguientes deben reconstruirse
FROM
: Define la imagen baseARG
: Variables solo para el buildENV
: Variables de entornoWORKDIR
: Directorio de trabajoCOPY/ADD
: Archivos que cambian poco (package.json, requirements.txt)RUN
: Comandos de instalación de dependenciasCOPY/ADD
: Resto del código fuenteCMD/ENTRYPOINT
: Comando de inicio
- ⚡ Builds más rápidos
- 💾 Mejor uso de la caché
- 🔄 Menos reconstrucciones innecesarias
- ⌛ Ahorro de tiempo en el proceso de desarrollo
Supongamos que modificas un archivo de código fuente:
- Cambias
src/app.js
COPY . .
invalida la cachénpm install
se ejecuta de nuevo 😫- Build tarda varios minutos
- Cambias
src/app.js
- Solo se invalida la caché después de
COPY . .
- Las dependencias ya instaladas se mantienen en caché ✨
- Build tarda segundos
- Usa
.dockerignore
para excluir archivos innecesarios - Combina comandos RUN relacionados usando
&&
- Limpia la caché de package managers en la misma capa donde se usan
- Considera usar multi-stage builds para casos más complejos