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.04En 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 nginxAquí, 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.htmlEste comando copia el archivo
index.htmldesde 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.gzen 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 /appA 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
CMDen 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.ENTRYPOINTpermite definir el comportamiento principal de un contenedor. - Ejemplo:
ENTRYPOINT ["nginx", "-g", "daemon off;"]Al igual que
CMD, esto hace que Nginx se ejecute, peroENTRYPOINTse 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=productionEsto establece la variable de entorno
ENVIRONMENTaproduction.
- 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
-po--publishendocker run. - Ejemplo:
EXPOSE 80Esto 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 /dataEsto crea un volumen en el directorio
/datadentro 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=$VERSIONEn este caso,
VERSIONes 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 nginxEsto 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.