# Caché de compilación de Docker


Cuando compilas la misma imagen de Docker varias veces, saber cómo optimizar
el caché de compilación es una gran herramienta para asegurarte de que las compilaciones se ejecuten rápidamente.

## Cómo funciona el caché de compilación

Comprender el caché de compilación de Docker te ayuda a escribir mejores Dockerfiles que
den como resultado compilaciones más rápidas.

El siguiente ejemplo muestra un pequeño Dockerfile para un programa escrito en C.

```dockerfile
# syntax=docker/dockerfile:1
FROM ubuntu:latest

RUN apt-get update && apt-get install -y build-essentials
COPY main.c Makefile /src/
WORKDIR /src/
RUN make build
```

Cada instrucción en este Dockerfile se traduce en una capa en tu imagen final.
Puedes pensar en las capas de la imagen como una pila, donde cada capa añade más contenido
sobre las capas anteriores:

![Diagrama de capas de imagen](/images/cache-stack.png)

Cada vez que una capa cambia, esa capa tendrá que volver a compilarse. Por ejemplo,
supongamos que realizas un cambio en tu programa en el archivo `main.c`. Después de este
cambio, el comando `COPY` tendrá que ejecutarse de nuevo para que esos cambios
aparezcan en la imagen. En otras palabras, Docker invalidará el caché para esta
capa.

Si una capa cambia, todas las demás capas que vienen después de ella también se ven afectadas. Cuando
la capa con el comando `COPY` se invalida, todas las capas siguientes también
necesitarán ejecutarse de nuevo:

![Diagrama de capas de imagen, mostrando la invalidación del caché](/images/cache-stack-invalidated.png)

Y ese es el caché de compilación de Docker en pocas palabras. Una vez que una capa cambia, todas
las capas posteriores también deben volver a compilarse. Incluso si no compilaran
nada de manera diferente, de igual forma necesitan volver a ejecutarse.

## Otros recursos

Para obtener más información sobre el uso del caché para realizar compilaciones eficientes, consulta:

- [Invalidación de caché](/build/cache/invalidation/)
- [Optimizar el caché de compilación](/build/cache/optimization/)
- [Recolección de basura (Garbage collection)](/build/cache/garbage-collection/)
- [Backends de almacenamiento de caché](/build/backends/)


