Dockerfile

la receta

3 min de lectura

Flujo de un Dockerfile

Un Dockerfile es un archivo de texto plano donde definimos las instrucciones que Docker debe ejecutar para construir una imagen.

Podemos verlo como la receta de nuestra aplicación: qué imagen base usamos, qué archivos copiamos, qué dependencias instalamos y qué comando se ejecuta al arrancar el contenedor.

Qué problema resuelve

Resuelve la necesidad de construir entornos de forma declarativa y reproducible.

En vez de configurar servidores manualmente, dejamos por escrito cómo se debe preparar la imagen de nuestra aplicación. Esto reduce errores, facilita los despliegues y permite que cualquier persona del equipo pueda construir el mismo entorno.

Cómo funciona internamente

Cuando ejecutas docker build, Docker lee el Dockerfile instrucción por instrucción y genera capas dentro de la imagen.

Cada instrucción (FROM, RUN, COPY, etc.) crea una capa nueva. Estas capas se apilan hasta formar la imagen final y Docker puede reutilizarlas mediante caché si no han cambiado.

Esto es clave por dos motivos:

  1. Caché de build: si una capa no cambió respecto al build anterior, Docker la reutiliza. Por eso el orden importa: primero conviene poner lo que cambia menos, como las dependencias, y después el código fuente.
  2. Inmutabilidad: una vez creada, una capa no se modifica. Si algo cambia, Docker genera una capa nueva encima.

Las instrucciones principales que vas a usar casi siempre:

InstrucciónQué hace
FROMDefine la imagen base de partida
WORKDIREstablece el directorio de trabajo dentro del contenedor
COPY / ADDCopia archivos del host a la imagen
RUNEjecuta un comando durante el build (instalar dependencias, compilar, etc.)
ENVDefine variables de entorno disponibles en el contenedor
EXPOSEDocumenta qué puerto usa la aplicación (no lo publica, solo informa)
USERDefine con qué usuario corre el proceso
CMD / ENTRYPOINTDefine el comando que se ejecuta al arrancar el contenedor
ARGDefine variables disponibles solo durante el build
HEALTHCHECKDefine cómo comprobar si el contenedor está “sano”

Existen más instrucciones (VOLUME, LABEL, SHELL, ONBUILD, STOPSIGNAL, etc.), pero son de uso más puntual. Puedes consultar la lista completa en la documentación oficial de Dockerfile.

Instrucciones de un Dockerfile

COPY vs ADD

En el caso básico hacen lo mismo: copiar archivos del host a la imagen.

La diferencia es que ADD puede descomprimir archivos .tar automáticamente y copiar desde una URL remota. Como tiene más comportamiento implícito, la práctica habitual es usar COPY y reservar ADD solo para casos concretos.

CMD vs ENTRYPOINT

No son dos formas de hacer lo mismo; se pueden combinar.

  • ENTRYPOINT define el ejecutable principal del contenedor.
  • CMD define los argumentos por defecto, y se puede sobrescribir al lanzar docker run.
ENTRYPOINT ["node"]
CMD ["index.js"]
docker run mi-app              # ejecuta: node index.js
docker run mi-app otro.js      # ejecuta: node otro.js (solo cambia el argumento)

Regla práctica: si el contenedor solo ejecuta una aplicación, con CMD suele ser suficiente. Si funciona más como una herramienta con distintos argumentos, ENTRYPOINT + CMD puede tener más sentido.

Capas de una imagen Docker