Introducción
Los contenedores están diseñados para ejecutar tareas y procesos específicos , no para alojar sistemas operativos. Usted crea un contenedor para servir una tarea de una sola unidad. Una vez que completa la tarea dada, se detiene . Por lo tanto, el ciclo de vida del contenedor depende del proceso en curso dentro de él. Una vez que el proceso se detiene, el contenedor también se detiene.
Un Dockerfile define este proceso. Es un script compuesto por instrucciones sobre cómo construir una imagen de Docker. En este script, hay dos tipos de instrucciones que puede definir el proceso que se ejecuta en el contenedor:
- PUNTO DE ENTRADA
- CMD
En este artículo, explicamos las diferencias entre Docker ENTRYPOINT y CMD y cuándo usar qué instrucción de Docker.
Docker Entrypoint frente a CMD:Resolviendo el dilema
En resumen, CMD define comandos y/o parámetros predeterminados para un contenedor. CMD es una instrucción que es mejor usar si necesita un comando predeterminado que los usuarios puedan anular fácilmente. Si un Dockerfile tiene varios CMD, solo aplica las instrucciones del último.
Por otro lado, ENTRADA se prefiere cuando desea definir un contenedor con un ejecutable específico. No puede anular un PUNTO DE ENTRADA al iniciar un contenedor a menos que agregue el --entrypoint
bandera.
Combinar ENTRYPOINT con CMD si necesita un contenedor con un ejecutable específico y un parámetro predeterminado que se pueda modificar fácilmente. Por ejemplo, al contener una aplicación, use ENTRYPOINT y CMD para establecer variables específicas del entorno.
Formulario Shell y Ejecutivo
Antes de comenzar, es importante discutir las formas de las instrucciones. Docker ENTRYPOINT y CMD pueden tener dos formas:
- Forma de caparazón
- Formulario ejecutivo
La sintaxis de cualquier comando en forma de shell es:
<instruction> <command>
La sintaxis de las instrucciones en formato exec es:
<instruction> ["executable", "parameter"]
Puede escribir instrucciones Docker CMD/ENTRYPOINT en ambos formatos:
CMD echo "Hello World"
(forma de concha)CMD ["echo", "Hello World"]
(formulario ejecutivo)ENTRYPOINT echo "Hello World"
(forma de concha)ENTRYPOINT ["echo", "Hello World"]
(formulario ejecutivo)
Sin embargo, trate de mantener todas sus instrucciones en formato ejecutivo. para evitar posibles problemas de rendimiento.
Comando de control de Docker
CMD de Docker define el ejecutable predeterminado de una imagen de Docker. Puede ejecutar esta imagen como base de un contenedor sin agregar argumentos de línea de comandos. En ese caso, el contenedor ejecuta el proceso especificado por el comando CMD.
La instrucción CMD solo se utiliza si no se agrega ningún argumento a run
comando al iniciar un contenedor. Por lo tanto, si agrega un argumento al comando, anula el CMD.
Para mostrarle cómo funciona CMD, crearemos un contenedor de muestra con una instrucción CMD.
Crear un Dockerfile con CMD y crear una imagen
1. Comienza creando una nueva MyDockerImage
carpeta para almacenar sus imágenes en:
sudo mkdir MyDockerImage
2. Vaya a esa carpeta y cree un nuevo Dockerfile:
cd MyDockerImage
sudo touch Dockerfile
3. Abra Dockerfile con su editor de texto favorito:
nano Dockerfile
4. Luego, agregue el siguiente contenido al archivo:
FROM ubuntu
MAINTAINER sofija
RUN apt-get update
CMD ["echo", "Hello World"]
En el contenido anterior, puede ver que usamos la instrucción CMD para repetir el mensaje Hello World
cuando el contenedor se inicia sin un comando específico.
5. Guardar y salir el archivo.
6. El siguiente paso es crear una imagen de Docker a partir del Dockerfile recién creado. Ya que todavía estamos en MyDockerImage
directorio, no necesita especificar la ubicación del Dockerfile, solo cree la imagen ejecutando:
sudo docker build .
7. La salida le dirá el nombre del contenedor. Puede verificar si está disponible entre las imágenes almacenadas localmente ejecutando:
sudo docker images
Ejecución de un contenedor Docker con CMD
Para ver CMD en acción, crearemos un contenedor basado en la imagen creada en el paso anterior.
Ejecute el contenedor con el comando:
sudo docker run [image_name]
Dado que no hay un argumento de línea de comandos, el contenedor ejecutará la instrucción CMD predeterminada y mostrará Hello World
mensaje. Sin embargo, si agrega un argumento al iniciar un contenedor, anula la instrucción CMD.
Por ejemplo, agregue el argumento de nombre de host al comando de ejecución de la ventana acoplable:
sudo docker run [image_name] hostname
Docker ejecutará el contenedor y el hostname
comando en lugar del comando de eco de CMD. Puedes ver esto en la salida.
Punto de entrada de Docker
ENTRYPOINT es la otra instrucción utilizada para configurar cómo se ejecutará el contenedor. Al igual que con CMD, debe especificar un comando y parámetros.
¿Cuál es la diferencia entre CMD y ENTRYPOINT? No puede anular la instrucción ENTRYPOINT agregando parámetros de línea de comandos a docker run
dominio. Al optar por esta instrucción, implica que el contenedor está diseñado específicamente para tal uso.
Siga leyendo para ver cómo aplicamos ENTRYPOINT en la creación de contenedores.
Creación de un Dockerfile con ENTRYPOINT y creación de una imagen
1. Use el Dockerfile creado en la sección CMD y edite el archivo para cambiar la instrucción. Abra el archivo existente con un editor de texto:
sudo nano Dockerfile
2. Edite el contenido reemplazando el comando CMD con ENTRYPOINT:
FROM ubuntu
MAINTAINER sofija
RUN apt-get update
ENTRYPOINT ["echo", "Hello World"]
3. Guardar y cerrar el archivo.
Ejecución de un contenedor Docker con ENTRYPOINT
1. Crea una nueva imagen usando el siguiente comando:
sudo docker build .
2. El resultado debe mostrar que ha creado correctamente la nueva imagen con un nombre dado. Ahora ejecútelo como un contenedor sin agregar ningún parámetro de línea de comando:
sudo docker run [container_name]
La salida será la misma que con CMD. Esto se debe a que no hemos agregado ningún argumento al comando de ejecución.
3. Para ver cómo funciona ENTRYPOINT, debe agregar un parámetro al iniciar un contenedor. Use el mismo comando que en el paso anterior y agregue algo después del nombre del contenedor:
sudo docker run [container_name] KnowledgeBase
Como puede ver, Docker no anuló la instrucción inicial de hacer eco de Hello World. Simplemente agregó el nuevo parámetro al comando existente.
Aunque puede usar ENTRYPOINT y CMD en ambos formularios, generalmente se recomienda seguir el formulario ejecutivo. . Esta es la solución más confiable, ya que la forma de caparazón ocasionalmente puede generar problemas sutiles en el proceso.
Punto de entrada de Docker con CMD
Como has visto hasta ahora, ENTRYPOINT y CMD son similares, pero no iguales. Además, estas dos instrucciones no son mutuamente excluyentes. Así es, es posible tener ambos en su Dockerfile.
Hay muchas situaciones en las que combinar CMD y ENTRYPOINT sería la mejor solución para su contenedor Docker. En tales casos, el ejecutable se define con ENTRYPOINT , mientras que CMD especifica el parámetro predeterminado .
Si está utilizando ambas instrucciones, asegúrese de mantenerlas en formato ejecutivo .
Siga leyendo para ver cómo ENTRYPOINT y CMD colaboran en nuestro ejemplo.
Ejecutar un contenedor con punto de entrada y CMD
1. Primero, vamos a modificar nuestro Dockerfile existente para que incluya ambas instrucciones. Abra el archivo con:
sudo nano Dockerfile
2. El archivo debe incluir una instrucción ENTRYPOINT que especifique el ejecutable, así como una instrucción CMD que defina el parámetro predeterminado que debe aparecer si no se agregan otros adicionales al comando de ejecución:
FROM ubuntu
MAINTAINER sofija
RUN apt-get update
ENTRYPOINT ["echo", "Hello"]
CMD ["World"]
3. Ahora, cree una nueva imagen a partir del Dockerfile modificado:
sudo docker build .
4. Probemos el contenedor ejecutándolo sin ningún parámetro. Introduce el comando:
sudo docker run [container_name]
Devolverá el mensaje Hello World
. Sin embargo, ¿qué sucede cuando agregamos parámetros al comando de ejecución de la ventana acoplable?
5. Use el mismo comando nuevamente, pero esta vez agregue su nombre al comando de ejecución:
sudo docker run [container_name] [your_name]
La salida ahora ha cambiado a Hello [your_name]
(en mi caso es Hello Sofija
). Esto se debe a que no puede anular las instrucciones de ENTRYPOINT, mientras que con CMD puede hacerlo fácilmente.