Entrypoint en Docker

Author
Por Darío Rivera
Publicado el en Docker

En el contexto de Docker y contenedores, el ENTRYPOINT define qué comando se ejecutará cuando se inicie un contenedor basado en una imagen. También puede verse como el comando por defecto si no se especifica ningún otro parámetro al inciar un contenedor.

Tomemos como ejemplo el Dockerfile de alpine/git.

FROM alpine

RUN apk fix && \
    apk --no-cache --update add git git-lfs gpg less openssh patch && \
    git lfs install

VOLUME /git
WORKDIR /git

ENTRYPOINT ["git"]
CMD ["--help"]

Esta imagen toma como base alpine e instala el paquete git en ella. Además, define como entrypoint el comando git junto con el parámetro por defecto --help. Esto significa que al ejecutar el siguiente comando obtendrás en pantalla la ayuda de git.

docker run alpine/git

Sin embargo, también es posible sobreescribir el parámetro por defecto ejecutado al iniciar un contenedor. Para esto basta agregar un nuevo parámetro. El siguiente comando sería equivalente a ejecutar git clone --help.

docker run alpine/git clone

Como podrás adivinar, si agregamos otro parámetro podemos sobreescribir el parámetro por defecto.

docker run alpine/git clone https://github.com/laravel/laravel.git

El anterior comando sería equivalente a ejecutar:

git clone https://github.com/laravel/laravel.git

Modo servidor

Un error muy común en docker, es intentar buscar un contenedor corriendo en primer o segundo plano cuando ha temrinado su ejecución. Por defecto, todos los contenedores paran su ejecución una vez han terminado de ejecutar sus comandos.

Cómo hacemos entonces para que nuestro contenedor quede corriendo después de haber terminado la ejecución de sus comandos?. Bueno, en teoría, esto no es posible, lo que si se puede hacer es configurar un comando que no termine su ejecución para poder tenerlo de manera indefinida corriendo. Es similar a como funcionan los contenedores basados en servidores web como por ejemplo apache o ngnix los cuales ejecutan de manera indefinida un servicio.

Vamos entonces a modificar el ejemplo anterior para intentar mantener nuestro contenedor vivo. Para esto vamos a crear un archivo llamada entrypoint el cual utilizaremos para extender la imagen anterior.

Dockerfile
FROM alpine/git

COPY ./entrypoint /

ENTRYPOINT ["/entrypoint"]
entrypoint
#!/bin/sh

start_server() {
  echo "Server started. Press CTRL-C to stop..."
  while true
  do sleep 1
  done
}

start_server

Al ejecutar docker build -t myalpine se creará una nueva imagen llamada myalpine en tu máquina local. Una vez hecho esto puedes correr el siguiente comando para crear e iniciar el contenedor en modo detach o segundo plano.

docker run -d myalpine

Dicho esto, podemos incluso hacer algo similar sin necesidad de crear una nueva imagen así:

docker run --entrypoint /bin/sh alpine/git -c "while true; do sleep 1; done"

Como es usual, también podemos mandar este proceso a segundo plano agregando el parámetro -d.

docker run --entrypoint /bin/sh -d alpine/git -c "while true; do sleep 1; done"

Una técnica comúnmente utilizada para mantener contenedores en ejecución sin un proceso activo real o bucle es redirigir un proceso en segundo plano a /dev/null.

docker run --entrypoint /bin/sh -d alpine/git -c "tail -f /dev/null"

El comando tail -f sigue la salida de un archivo y, dado que /dev/null no produce ningún contenido, esto simplemente crea un proceso que se mantiene ejecutando indefinidamente sin consumir recursos significativos.


Acerca de Darío Rivera

Author

Application Architect at Elentra Corp . Quality developer and passionate learner with 10+ years of experience in web technologies. Creator of EasyHttp , an standard way to consume HTTP Clients.

LinkedIn Twitter Instagram

Sólo aquellos que han alcanzado el éxito saben que siempre estuvo a un paso del momento en que pensaron renunciar.