ENTRYPOINT es una de las opciones de configuración más importantes de Docker. Se encuentra en el archivo Dockerfile y te permite determinar el comportamiento por defecto del contenedor. Esta capacidad hace que ENTRYPOINT sea extremadamente útil para automatizar el comportamiento de los contenedores en tiempo de ejecución.

Este artículo explora a fondo el uso de ENTRYPOINT en Docker, incluyendo cómo funciona, por qué es esencial y cómo configurarlo correctamente.

Docker ENTRYPOINT Explicado

ENTRYPOINT sirve como punto de partida para el proceso de ejecución de un contenedor Docker. Cuando creas una imagen Docker y la instancias como contenedor, el comando ENTRYPOINT se ejecuta por defecto.

ENTRYPOINT te permite establecer el propósito principal del contenedor, como ejecutar un servidor web, una base de datos o una aplicación. También te permite pasar argumentos en tiempo de ejecución para personalizar el comportamiento del contenedor.

Sintaxis y Uso de ENTRYPOINT

Las dos opciones sintácticas para definir ENTRYPOINT en un Dockerfile son la forma shell y la forma exec. Ambos enfoques implican insertar una línea en el Dockerfile. Como la configuración de ENTRYPOINT no afecta directamente al proceso de compilación, puedes colocarla en cualquier lugar del archivo. Sin embargo, la mayoría de los programadores tienden a colocar el comando ENTRYPOINT hacia el final.

Sintaxis de la forma shell

Cuando ENTRYPOINT se ejecuta utilizando la forma shell, invoca un shell de comandos para su procesamiento. Este método incluye sustituciones de variables de entorno, pero bloquea la posibilidad de añadir argumentos en forma exec:

ENTRYPOINT command param1 param2

Aquí, command es el comando principal que se ejecuta cuando se inicia el contenedor. param1 y param2 son argumentos del comando.

Sintaxis de la forma exec

El formulario de ejecución no invoca un intérprete de comandos. En su lugar, ejecuta directamente el comando y los parámetros especificados. Este método te permite añadir argumentos a través de CMD o de la línea de comandos en tiempo de ejecución:

ENTRYPOINT ["executable", "param1", "param2"]

Aquí, executable es el comando principal, y param1 y param2 son argumentos para el ejecutable.

ENTRYPOINT en Acción

Vamos a crear un sencillo comando ENTRYPOINT para un archivo Dockerfile para ver cómo funciona. No puedes probarlo sin iniciar tu contenedor porque su instrucción se procesa en tiempo de ejecución, no en tiempo de compilación.

Aquí tienes un ejemplo utilizando la forma exec:

ENTRYPOINT ["python", "app.py"]

Cuando este contenedor se inicia, lanza un intérprete de Python y ejecuta el script app.py para que actúe como comportamiento por defecto de tu contenedor.

Para repetir este ejemplo con la forma shell, tienes que hacer un ligero cambio:

ENTRYPOINT python app.py

Este ejemplo inicia el intérprete de Python desde un comando shell en lugar de ejecutarlo directamente.

ENTRYPOINT Con CMD

CMD es una instrucción de Dockerfile que proporciona los argumentos por defecto para un contenedor en ejecución. Pueden adoptar la forma de un comando ejecutable o servir como parámetros adicionales para la instrucción ENTRYPOINT. Al iniciar un contenedor, puedes anular estos parámetros proporcionando argumentos al comando docker run.

Al igual que ENTRYPOINT, puedes escribir CMD en forma exec o shell. La diferencia clave es que CMD establece comandos o parámetros por defecto que puedes anular desde la línea de comandos. Mientras tanto, ENTRYPOINT configura los contenedores para que se ejecuten como ejecutables, lo que significa que no puedes anular el comando desde la línea de comandos.

Puedes utilizar CMD para extender la funcionalidad de ENTRYPOINTy dotar a tu imagen de mayor flexibilidad. La combinación de ambas te permite personalizar el comportamiento de tu imagen, con los valores de CMD actuando como argumentos por defecto para la instrucción ENTRYPOINT. Este método te permite establecer una instrucción por defecto a través de ENTRYPOINT y argumentos por defecto a través de CMD.

A diferencia de utilizar sólo ENTRYPOINT, este método te permite anular los parámetros pasados durante el comando docker run.

Para que el ejemplo anterior sea más flexible, puedes incluir un comando CMD:

ENTRYPOINT ["python", "app.py"]
CMD ["--help"]

En este ejemplo, iniciar un contenedor Docker sin proporcionar ningún argumento en la línea de comandos significa que python app.py --help se ejecutará por defecto. Sin embargo, si proporcionas argumentos al iniciar el contenedor (como docker run <image> --version) se sustituirán los argumentos por defecto de CMD, dando como resultado python app.py --version. Este enfoque te ofrece una mayor flexibilidad a la hora de ejecutar tus contenedores.

Casos de Uso de ENTRYPOINT en Docker

El uso más habitual de ENTRYPOINT es crear imágenes para aplicaciones o servicios específicos. Por ejemplo, si creas una imagen para ejecutar una aplicación Python, puedes utilizar ENTRYPOINT para especificar que se ejecute el intérprete de Python.

También puedes utilizar ENTRYPOINT al crear imágenes Docker para canalizaciones de Integración Continua y Despliegue Continuo (CI/CD). Puedes utilizar estas imágenes para encapsular el entorno necesario para cada etapa con el fin de garantizar la coherencia. Por ejemplo, puedes crear una imagen Docker con el ENTRYPOINT configurado para un script de pruebas. Esta imagen ejecuta estas pruebas automáticamente cada vez que se ejecuta para proporcionar un entorno de pruebas coherente y repetible.

ENTRYPOINT también es útil para depurar aplicaciones en contenedores. Iniciando una sesión de shell con ENTRYPOINT, puedes interactuar con el entorno de la aplicación dentro del contenedor. Estas interacciones incluyen ejecutar comandos, explorar archivos e inspeccionar el estado de la aplicación. Una vez resuelto el problema, puedes reconstruir la imagen Docker con el ENTRYPOINT adecuado para ejecutar la aplicación.

Cómo Anular ENTRYPOINT

Es posible anular el ENTRYPOINT de una imagen Docker en tiempo de ejecución para una mayor flexibilidad. Puedes hacerlo proporcionando un comando después del nombre de la imagen en el comando docker run.

Por ejemplo, si tu imagen tiene un script de Python como ENTRYPOINT, pero en su lugar quieres abrir un shell dentro del contenedor, puedes ejecutar lo siguiente:

docker run --entrypoint <image> “/bin/bash”

Este script anula el ENTRYPOINT predeterminado de la aplicación e inicia un shell bash.

Del mismo modo, para ejecutar un script Python diferente, puedes proporcionar ese script como comando. Esta táctica te da flexibilidad para ejecutar tu contenedor con unos parámetros distintos de los que figuran originalmente en el ENTRYPOINT de tu Dockerfile.

Buenas Prácticas para Utilizar ENTRYPOINT en Docker

Dado que ENTRYPOINT es un comando tan crucial para Docker, es importante seguir estas buenas prácticas para maximizar su uso.

Mantén los contenedores centrados en una única responsabilidad

ENTRYPOINT especifica las responsabilidades de tu contenedor Docker. Al igual que los microservicios, cada contenedor debe centrarse en una única responsabilidad, servicio o parte de una aplicación. Este enfoque aumenta la modularidad y escalabilidad de tu aplicación, facilitando su desarrollo, prueba y mantenimiento.

Asegúrate de que los scripts ENTRYPOINT son ejecutables y tienen el formato adecuado

Hacer que los scripts de ENTRYPOINT sean ejecutables y tengan el formato adecuado puede evitar problemas como errores de sintaxis y de permisos.

Para asegurarte de que los scripts ENTRYPOINT son ejecutables, puedes utilizar la siguiente instrucción RUN chmod +x:

COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

Este ejemplo copia el script entrypoint. sh en el contenedor y utiliza la instrucción RUN chmod +x para hacerlo ejecutable. A continuación, define la instrucción ENTRYPOINT para utilizar el script entrypoint.sh.

También puedes utilizar un linter como ShellCheck para comprobar la sintaxis y el estilo de los scripts y asegurarte de que tienen el formato adecuado.

Evita codificar valores en los scripts ENTRYPOINT

Utilizar variables de entorno o argumentos de línea de comandos en lugar de codificarlos puede hacer que tus scripts sean más flexibles. También te permite configurar la ruta del archivo desde fuera del contenedor.

Por ejemplo, en lugar de codificar una ruta de archivo en el script ENTRYPOINT de la siguiente manera:

#!/bin/bash
echo "Starting my application..."
./my-app -f /path/to/my/file.txt

Puedes utilizar una variable como ésta

#!/bin/bash
echo "Starting my application..."
./my-app -f "${MY_FILE}"

El uso de variables proporciona a tu imagen una mayor personalización sobre la marcha, permitiéndote hacer más cosas sin reescribir tu Dockerfile.

Docker y Kinsta Trabajan Juntos

Kinsta ofrece una plataforma potente y flexible para desplegar aplicaciones web utilizando Docker. Te ayuda a construir y desplegar imágenes Docker personalizadas para un mayor control y flexibilidad sobre tu entorno de alojamiento.

Tanto si estás construyendo un entorno de alojamiento personalizado como escalando tu aplicación para manejar más tráfico, Kinsta te proporciona las herramientas y el soporte que necesitas para tener éxito.

Resumen

ENTRYPOINT es una herramienta esencial para configurar los contenedores Docker. Establece el comando predeterminado que se ejecuta cuando un contenedor se inicia desde una imagen, definiendo su función principal. Puedes utilizar ENTRYPOINT para ejecutar aplicaciones específicas, ayudar en las canalizaciones CI/CD, o combinarlo con CMD para un comportamiento más flexible de los contenedores.

Docker es actualmente la herramienta para desarrolladores más popular, por lo que es fundamental para diversos despliegues en contenedores. Para saber más sobre Docker, consulta los artículos de Kinsta y echa un vistazo a Kinsta para alojar tus aplicaciones en contenedores.

Kinsta hace que tu flujo de trabajo de desarrollo sea más fácil y eficiente. Características como las aplicaciones en contenedores en infraestructura GCP que se ejecutan en máquinas C2 con centros de datos 37 disponibles, integración premium con Cloudflare para una CDN de alto rendimiento que sirve tu sitio desde 260+ Puntos de Presencia (PoPs), protección DDoS de cortafuegos de nivel empresarial, Edge Caching y monitorización del tiempo de actividad (con una garantía de tiempo de actividad del 99%), garantizan que tu aplicación se ejecute de forma rápida, segura y esté disponible de forma fiable en Internet.

Marcia Ramos Kinsta

I'm the Editorial Team Lead at Kinsta. I'm a open source enthusiast and I love coding. With more than 7 years of technical writing and editing for the tech industry, I love collaborating with people to create clear and concise pieces of content and improve workflows.