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.
Descubre más contenido