En esta lección aprenderás instrucción CMD Dockerfile, la instrucción que define qué comando se ejecuta por defecto cuando arrancas un contenedor desde una imagen.
CMD no se ejecuta durante el build. Para instalar paquetes o preparar archivos se usa RUN. CMD describe el proceso por defecto en tiempo de ejecución.
👉 Y recuerda, si quieres aprender más de Linux, visita el curso de Linux gratis.
🐳 Si quieres aprender más de Docker, visita el curso de Docker gratis.
Qué hace la instrucción CMD Dockerfile
Problema: una imagen necesita declarar qué proceso debe arrancar si el usuario no indica otro comando en docker run.
Qué aporta Docker: CMD define ese comando por defecto. Si al ejecutar el contenedor pasas otro comando al final, Docker puede sustituir el CMD.
| Forma | Recomendación |
|---|---|
| Exec form | Preferible: CMD [«nginx», «-g», «daemon off;»] |
| Shell form | Úsala solo si necesitas interpretación del shell. |
| Solo un CMD efectivo | Si hay varios CMD, Docker usa el último. |
Formas de escribir CMD
CMD admite una forma exec, una forma shell y una forma con solo argumentos para acompañar a un ENTRYPOINT exec. La forma exec se escribe como una lista JSON y suele ser la opción más previsible para el proceso principal. La forma shell se ejecuta mediante el shell de la imagen; úsala cuando necesites su expansión de variables o sintaxis, teniendo en cuenta el efecto en las señales.
| Forma | Qué define | Comportamiento |
|---|---|---|
| CMD [«programa», «argumento»] | Comando ejecutable y argumentos predeterminados. | Arranca directamente el programa si no hay ENTRYPOINT. |
| CMD [«argumento»] | Argumentos por defecto de un ENTRYPOINT en forma exec. | El ejecutable fijo recibe esos argumentos al arrancar. |
| CMD programa argumentos | Una orden en forma shell. | Se interpreta con el shell predeterminado de la imagen. |
Ejemplo práctico
FROM nginx:stable-alpine
COPY ./public /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]docker build -t cmd-demo:1.0 .
docker run --rm cmd-demo:1.0
docker run --rm cmd-demo:1.0 nginx -vEl primer docker run usa el CMD definido en la imagen. El segundo pasa otro comando al final y, por tanto, sustituye el CMD por defecto.
Cómo se reemplaza CMD al ejecutar el contenedor
Si la imagen solo tiene CMD, los argumentos que añadas después del nombre de la imagen en docker run reemplazan el comando y los argumentos predeterminados. Si hay un ENTRYPOINT en forma exec, esos mismos argumentos sustituyen los valores de CMD y se pasan al ejecutable fijo. Esta diferencia permite crear imágenes que son tanto servicios con valores iniciales como herramientas configurables.
| Configuración | Arranque | Resultado |
|---|---|---|
| CMD [«nginx», «-g», «daemon off;»] | docker run imagen | Se ejecuta Nginx con los argumentos por defecto. |
| La misma configuración | docker run imagen nginx -v | El comando de ejecución reemplaza CMD. |
| ENTRYPOINT [«nginx»] y CMD [«-g», «daemon off;»] | docker run imagen -v | ENTRYPOINT sigue ejecutándose y -v reemplaza los argumentos por defecto. |
Errores comunes
- Confundir CMD con RUN: RUN construye la imagen; CMD define qué se ejecuta al arrancar el contenedor.
- Poner varios CMD esperando que se ejecuten todos: solo cuenta el último.
- Usar shell form sin necesidad: puede complicar señales y argumentos.
- Meter tareas de inicialización frágiles: si necesitas lógica compleja, evalúa ENTRYPOINT o un script bien controlado.
Advertencia: si el proceso principal no gestiona bien señales, el contenedor puede tardar en detenerse o cerrarse mal. Por eso suele recomendarse exec form cuando sea posible.
Lecciones relacionadas del curso Docker
- Instrucción RUN Dockerfile
- Instrucción ENTRYPOINT
- Diferencia entre CMD y ENTRYPOINT
- Instrucción EXPOSE Dockerfile
- Cómo ejecutar comandos dentro de un contenedor
Documentación oficial y recursos
- Referencia oficial de CMD
- Referencia oficial de ENTRYPOINT
- Recomendaciones sobre procesos en contenedores
La instrucción CMD Dockerfile queda bien usada cuando define un proceso por defecto claro, sustituible y alineado con la función principal de la imagen.
Si necesitas combinar comando fijo y argumentos variables, continúa con ENTRYPOINT y después con la diferencia entre CMD y ENTRYPOINT.

