Entrypoint en Docker
En el contexto de Docker y contenedores, el
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.
FROM alpine/git
COPY ./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.