Dockerfile
Un archivo Dockerfile
es un script de texto que contiene una serie de instrucciones que Docker utiliza para construir una imagen de contenedor. Es esencialmente una receta que describe cómo se debe configurar el contenedor, incluyendo qué sistema operativo utilizar, qué software instalar, y cómo debe comportarse cuando se ejecuta.
Estructura y Sintaxis de un Dockerfile
El archivo Dockerfile
tiene una sintaxis específica, con cada instrucción escrita en una nueva línea. A continuación, se detallan las instrucciones más comunes que puedes encontrar en un Dockerfile
:
- FROM:
- Descripción: Define la imagen base a partir de la cual se construirá la nueva imagen. Es la primera instrucción en un
Dockerfile
. - Ejemplo:
FROM ubuntu:20.04
En este caso, la imagen base es Ubuntu 20.04.
- Descripción: Define la imagen base a partir de la cual se construirá la nueva imagen. Es la primera instrucción en un
- RUN:
- Descripción: Ejecuta un comando en el contexto de la imagen durante el proceso de construcción. Generalmente se utiliza para instalar software, actualizar paquetes, configurar el sistema, etc.
- Ejemplo:
RUN apt-get update && apt-get install -y nginx
Aquí, se actualiza el sistema de paquetes de Ubuntu y se instala el servidor web Nginx.
- COPY:
- Descripción: Copia archivos o directorios desde el sistema de archivos del host al sistema de archivos de la imagen.
- Ejemplo:
COPY ./index.html /usr/share/nginx/html/index.html
Este comando copia el archivo
index.html
desde el host al contenedor en la ubicación especificada.
- ADD:
- Descripción: Similar a
COPY
, pero con funcionalidades adicionales como la extracción automática de archivos comprimidos o la descarga de archivos desde una URL. - Ejemplo:
ADD https://example.com/somefile.tar.gz /usr/local/src/
Esto descarga y extrae el archivo
somefile.tar.gz
en la ruta especificada dentro del contenedor.
- Descripción: Similar a
- WORKDIR:
- Descripción: Establece el directorio de trabajo para las siguientes instrucciones
RUN
,CMD
,ENTRYPOINT
,COPY
, yADD
. Si el directorio no existe, Docker lo crea. - Ejemplo:
WORKDIR /app
A partir de este punto, todas las instrucciones que sigan se ejecutarán en el directorio
/app
.
- Descripción: Establece el directorio de trabajo para las siguientes instrucciones
- CMD:
- Descripción: Especifica el comando que se ejecutará cuando un contenedor basado en esta imagen se inicie. Solo puede haber una instrucción
CMD
en un Dockerfile; si se especifican múltiples, solo la última se usará. - Ejemplo:
CMD ["nginx", "-g", "daemon off;"]
Aquí, cuando se ejecute el contenedor, se iniciará el servidor Nginx.
- Descripción: Especifica el comando que se ejecutará cuando un contenedor basado en esta imagen se inicie. Solo puede haber una instrucción
- ENTRYPOINT:
- Descripción: Similar a
CMD
, pero se utiliza para configurar el contenedor de tal manera que se comporte como un ejecutable específico.ENTRYPOINT
permite definir el comportamiento principal de un contenedor. - Ejemplo:
ENTRYPOINT ["nginx", "-g", "daemon off;"]
Al igual que
CMD
, esto hace que Nginx se ejecute, peroENTRYPOINT
se combina con cualquier argumento adicional pasado al contenedor cuando se ejecuta.
- Descripción: Similar a
- ENV:
- Descripción: Establece variables de entorno que estarán disponibles en el contenedor.
- Ejemplo:
ENV ENVIRONMENT=production
Esto establece la variable de entorno
ENVIRONMENT
aproduction
.
- EXPOSE:
- Descripción: Informa a Docker que el contenedor escucha en un puerto específico en tiempo de ejecución. Esto no publica el puerto, solo lo expone. Para hacerlo accesible desde fuera del contenedor, se debe usar el argumento
-p
o--publish
endocker run
. - Ejemplo:
EXPOSE 80
Esto expone el puerto 80 en el contenedor.
- Descripción: Informa a Docker que el contenedor escucha en un puerto específico en tiempo de ejecución. Esto no publica el puerto, solo lo expone. Para hacerlo accesible desde fuera del contenedor, se debe usar el argumento
- VOLUME:
- Descripción: Crea un punto de montaje en el contenedor, que puede ser utilizado para persistir datos en volúmenes de Docker.
- Ejemplo:
VOLUME /data
Esto crea un volumen en el directorio
/data
dentro del contenedor.
- ARG:
- Descripción: Define variables que se pueden pasar durante el proceso de construcción con
docker build --build-arg
. - Ejemplo:
ARG VERSION=latest RUN apt-get install myapp=$VERSION
En este caso,
VERSION
es una variable que puede ser modificada en el momento de construir la imagen.
- Descripción: Define variables que se pueden pasar durante el proceso de construcción con
- USER:
- Descripción: Especifica el usuario bajo el cual se ejecutarán las siguientes instrucciones
RUN
,CMD
,ENTRYPOINT
, etc. - Ejemplo:
USER nginx
Esto indica que las siguientes operaciones dentro del contenedor se ejecutarán con el usuario
nginx
.
- Descripción: Especifica el usuario bajo el cual se ejecutarán las siguientes instrucciones
- LABEL:
- Descripción: Añade metadatos a la imagen, como información sobre el autor, la versión, o cualquier otra información personalizada.
- Ejemplo:
LABEL maintainer="tuemail@example.com"
Esto añade una etiqueta con la información del mantenedor de la imagen.
Ejemplo completo de un Dockerfile
A continuación, un ejemplo de un Dockerfile
que configura un simple servidor web Nginx con una página HTML personalizada:
# Utilizar una imagen base de Ubuntu
FROM ubuntu:20.04
# Establecer el directorio de trabajo
WORKDIR /usr/share/nginx/html
# Instalar Nginx
RUN apt-get update && apt-get install -y nginx
# Copiar un archivo HTML personalizado al contenedor
COPY index.html /usr/share/nginx/html/index.html
# Exponer el puerto 80
EXPOSE 80
# Iniciar Nginx
CMD ["nginx", "-g", "daemon off;"]
Flujo de trabajo del Dockerfile:
- Imagen base: Parte de una imagen de Ubuntu 20.04.
- Configuración: Establece un directorio de trabajo y actualiza e instala Nginx.
- Copiar archivo: Agrega una página HTML personalizada al contenedor.
- Exponer puerto: Indica que el contenedor debería escuchar en el puerto 80.
- Comando de inicio: Define que, al iniciarse el contenedor, se ejecute Nginx en primer plano.
Este archivo Dockerfile
, cuando se utiliza para construir una imagen Docker, produce un contenedor que ejecuta un servidor web Nginx con la página HTML que se ha copiado.