La diferencia entre CMD y ENTRYPOINT en imágenes de Docker

La CMD es ENTRYPOINT las instrucciones son dos comúnmente confundidas Dockerfile directivas. Ambos juegan un papel en la determinación del comando que se ejecutará cuando se inicie el contenedor.

La CMD es ENTRYPOINT se puede sobrescribir individualmente dentro de cada imagen. El uso eficaz de estas directivas simplifica el uso del contenedor al acortar la longitud de los comandos suministrados.

¿Cuál es el punto de entrada?

Ya veremos ENTRYPOINT primero, ya que se procesa primero 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 tiene como valor predeterminado el punto de entrada /bin/sh -c. Esto significa que se encontrará en una sesión de shell cuando inicie el contenedor. Para muchos contenedores, es más deseable tener un proceso diferente que se inicie de forma predeterminada. Desea que los servicios sin cabeza comiencen su carga de trabajo de inmediato.

El escenario de ENTRYPOINT directiva en un Dockerfile le dice 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á el date mando. Cómo date no es un proceso de primer plano duradero, el contenedor saldrá poco después.

Los puntos de entrada deben ser archivos binarios o secuencias de comandos 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.

Agregar comando (CMD)

La CMD la educación es un nombre poco apropiado. Proporciona argumentos predefinidos para el comando definido por ENTRYPOINT.

ENTRYPOINT ["date"]
CMD ["+%A"]

En este ejemplo, el contenedor se está ejecutando date +%A. La +%A argumento a date muestra la corriente día de la semana (ex Monday).

CMD está diseñado para sobrescribirse. docker run le permite especificar un comando diferente para una sola instancia de contenedor:

docker run my-image +%B

El valor por defecto CMD se sobrescribirá 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. La CMD siempre se agrega al archivo ENTRYPOINT, por lo que el comando final se convierte en date +%B.

Deberías usar ENTRYPOINT para definir el tuyo ejecutable principal del contenedor. Usar CMD para definir los argumentos predeterminados para ese ejecutable. Se sobrescribirá cuando el contenedor se ejecute con diferentes argumentos.

Anulaciones del punto de entrada

Puede obligar a Docker a lanzar una imagen utilizando un punto de entrada personalizado. Pasa el --entrypoint marcar un docker run:

docker run --entrypoint /bin/sh my-image

El punto de entrada definido en la imagen del contenedor se ignorará a favor del comando especificado. En nuestro ejemplo, se iniciará una sesión de shell en lugar del archivo date mando.

La anulación de los puntos de entrada debería ser algo poco común. Puede ir en contra de las intenciones del autor de la imagen. Establecer un punto de entrada personalizado puede ser útil, especialmente al depurar. Si un contenedor se comporta mal, anular su punto de entrada puede otorgarle acceso al shell que de otro modo no obtendría.

Cual usar?

Si eres autor de imágenes, debes usar ENTRYPOINT al definir lo que ejecutará el contenedor. Si desea proporcionar argumentos predeterminados, pero espera que el usuario los anule, incluya CMD puré de patatas.

Como usuario de imágenes, normalmente puede seguir anulando CMD. docker run tiene soporte transparente para anulación de comando. Cualquier argumento dado después del nombre de la imagen se interpretará como CMD cuerda para el contenedor.

Modo 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 de 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 tanto, los usuarios no podrán emitir reemplazos. Argumentos dados un docker run será ignorado; su contenedor siempre usará el punto de entrada como está.

Dado 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 informará el archivo concha detener, en lugar del proceso interno. Puedes comenzar tu 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 temas le ayuda a ocultar la complejidad en sus contenedores. Esto es especialmente beneficioso al crear contenedores de utilidades para encapsular programas CLI.

Configure su binario CLI como el punto de entrada de la imagen. Esto permite a los usuarios interactuar sin repetir el nombre binario en cada comando.

Considere si hemos empaquetado lo anterior Dockerfile cómo 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

Estibador ENTRYPOINT es CMD las instrucciones son una fuente frecuente de confusión. Su denominación enmascara los propósitos previstos.

Usar ENTRYPOINT para configurar el "comando" que se ejecutará al iniciar nuevos contenedores. Puede definir argumentos predefinidos usando CMD. ENTRYPOINT es CMD se combinan para producir la cadena de comandos final del contenedor.

Cuando usas docker run, Docker anula la configuración de imagen predeterminada CMD con los argumentos especificados. Si necesita sobrescribir el punto de entrada de una imagen, use el archivo --entrypoint bandera.

¿Qué te ha parecido?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir