GNU/Linux >> Tutoriales Linux >  >> Panels >> Docker

La diferencia entre CMD y ENTRYPOINT en Docker Images

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.


Docker
  1. diferencia entre podman y docker.

  2. ¿La diferencia entre [[ $a ==Z* ]] y [ $a ==Z* ]?

  3. Centos:¿la diferencia entre el apagado a las 18:00 y el apagado a las 18:00?

  4. ¿Cuál es la diferencia entre COPIAR y AÑADIR en Dockerfiles?

  5. ¿Dónde se almacenan las imágenes, los contenedores y los volúmenes de Docker en el sistema host de Linux?

Docker CMD vs. Comandos de punto de entrada:¿Cuál es la diferencia?

La diferencia entre sudo y su explicada

Cómo actualizar la imagen y el contenedor de Docker a la última versión

Uso de las instrucciones ENTRYPOINT y CMD de Dockerfile

Cómo copiar archivos entre el host y el contenedor Docker

¿Cuál es la diferencia entre unlink y rm?