El CMD
y ENTRYPOINT
las instrucciones son dos Dockerfile
comúnmente confundidos directivas. Ambos tienen un papel en la determinación del comando que se ejecutará cuando se inicie el contenedor.
El CMD
y ENTRYPOINT
se puede anular individualmente dentro de cada imagen. El uso efectivo de estas directivas hace que su contenedor sea más fácil de usar al acortar la longitud de los comandos que proporciona.
¿Qué es el punto de entrada?
Veremos ENTRYPOINT
primero ya que se procesa antes de CMD
al iniciar un nuevo contenedor. El punto de entrada de la imagen define el proceso que se ejecutará cuando se inicie el contenedor.
Docker establece por defecto el punto de entrada en /bin/sh -c
. Esto significa que terminará en una sesión de shell cuando inicie el contenedor. Para muchos contenedores, es más deseable que se inicie un proceso diferente de forma predeterminada. Desea que los servicios autónomos comiencen su carga de trabajo de inmediato.
Configuración del ENTRYPOINT
directiva en un Dockerfile
indica a Docker que ejecute un comando específico cuando se inicia el contenedor. Se convertirá en el proceso de primer plano, en lugar de la sesión de shell predeterminada.
ENTRYPOINT ["date"]
Un contenedor creado con este Dockerfile
ejecutará la date
dominio. Como date
no es un proceso de primer plano de larga duración, el contenedor se cerrará inmediatamente después.
Los puntos de entrada deben ser scripts o archivos binarios ejecutables. Su contenedor no se iniciará si especifica un punto de entrada no válido. Si está utilizando un script personalizado, asegúrese de que tenga configurado el bit ejecutable. Puede agregar permisos de ejecución usando chmod +x my-script.sh
.
Agregando el Comando (CMD)
El CMD
instrucción es algo así como un nombre inapropiado. Proporciona argumentos predeterminados para el comando definido por ENTRYPOINT
.
ENTRYPOINT ["date"] CMD ["+%A"]
Este ejemplo da como resultado que el contenedor ejecute date +%A
. El +%A
argumento a date
muestra el día actual de la semana (por ejemplo, Monday
).
CMD
está diseñado para ser anulado. docker run
le permite especificar un comando diferente para una instancia de contenedor individual:
docker run my-image +%B
El CMD
predeterminado se anulará con +%B
, lo que hace que el contenedor muestre el nombre del mes actual. Esto funciona porque el punto de entrada de la imagen permanece intacto. El CMD
siempre se adjunta al ENTRYPOINT
, por lo que el comando final se convierte en date +%B
.
Deberías usar ENTRYPOINT
para definir el ejecutable principal de su contenedor. Usa CMD
para definir los argumentos predeterminados para ese ejecutable. Se anulará cuando el contenedor se ejecute con diferentes argumentos.
Anulaciones de puntos de entrada
Puede obligar a Docker a iniciar una imagen mediante un punto de entrada personalizado. Pase el --entrypoint
marcar para docker run
:
docker run --entrypoint /bin/sh my-image
El punto de entrada definido en la imagen del contenedor se ignorará en favor del comando que haya especificado. En nuestro ejemplo, se iniciará una sesión de shell, en lugar de la date
comando.
La anulación de los puntos de entrada debería ser una ocurrencia rara. Puede ir en contra de las intenciones del autor de la imagen. Sin embargo, establecer un punto de entrada personalizado puede ser útil, especialmente durante la depuración. Si un contenedor se comporta mal, anular su punto de entrada puede otorgarle acceso de shell que de otro modo no podría obtener.
¿Cuál usar?
Si eres un autor de imágenes, debes usar ENTRYPOINT
al definir qué ejecutará su contenedor. Si desea proporcionar argumentos predeterminados, pero espera que el usuario los anule, incluya CMD
también.
Como usuario de imágenes, normalmente puede ceñirse a anular CMD
. docker run
tiene soporte transparente para anulaciones de comandos. Cualquier argumento proporcionado después del nombre de la imagen se interpretará como CMD
cadena para el contenedor.
Modos de punto de entrada:Shell o Exec
Docker en realidad admite dos formas diferentes de ENTRYPOINT
:modo exec y modo shell. El modo Exec se caracteriza por el uso de una construcción de matriz para especificar parámetros. En el modo shell, el comando se especifica como una cadena.
# exec mode ENTRYPOINT ["binary", "--param", "--another-param"] # shell mode ENTRYPOINT binary --param --another-param
El uso del modo shell hace que su binario se ejecute como un subproceso de /bin/sh -c
. Esto le da a su punto de entrada acceso a las variables de entorno definidas por el shell.
Sin embargo, el modo Shell tiene compensaciones. No puedes usar CMD
por lo que los usuarios no podrán emitir anulaciones. Argumentos dados a docker run
será ignorado; su contenedor siempre usará el punto de entrada tal cual.
Debido a que su binario se ejecuta dentro de un shell, los comandos del ciclo de vida de Docker como docker stop
puede funcionar de forma errática o no funcionar en absoluto. Docker señalará el shell detenerse, en lugar del proceso interno. Puede iniciar su proceso con exec
para evitar esto.
ENTRYPOINT exec binary --param --another-param
Beneficios del enfoque de punto de entrada de Docker
Separar el punto de entrada de sus argumentos lo ayuda a ocultar la complejidad en sus contenedores. Esto es más beneficioso cuando crea contenedores de utilidades para encapsular programas CLI.
Configure el binario de su CLI como punto de entrada de la imagen. Esto permite a los usuarios interactuar sin repetir el nombre binario en cada comando.
Considere si empaquetamos el Dockerfile
anterior como date:latest
:
# default entrypoint (/bin/sh -c) docker run date:latest date +%A # with `date` as the entrypoint docker run date:latest +%A`
Establecer un punto de entrada personalizado acorta los comandos y reduce la repetición. El contenedor se vuelve más especializado al invocar date
automáticamente. Esto crea una interfaz más amigable para sus usuarios.
Resumen
ENTRYPOINT
de Docker y CMD
Las instrucciones son una fuente frecuente de confusión. Su nombre enmascara los propósitos previstos.
Usa ENTRYPOINT
para establecer el "comando" que se ejecutará cuando se inicien nuevos contenedores. Puede definir argumentos predeterminados usando CMD
. ENTRYPOINT
y CMD
se combinan para producir la cadena de comandos final del contenedor.
Cuando usas docker run
, Docker reemplaza el CMD
predeterminado de la imagen con los argumentos que especifique. Si necesita anular el punto de entrada de una imagen, use el --entrypoint
bandera.