Cómo ejecutar comandos dentro de un contenedor

como-ejecutar-comandos-dentro-de-un-contenedor
como-ejecutar-comandos-dentro-de-un-contenedor

docker exec ejecuta un proceso nuevo dentro de un contenedor que ya está en marcha. Sirve para consultar archivos, revisar una configuración o abrir una shell de diagnóstico sin detener el proceso principal.

El proceso iniciado con exec existe mientras el contenedor sigue activo y termina por separado. No reconstruye la imagen ni convierte cambios hechos a mano en una configuración permanente. Usa esta orden para inspeccionar y diagnosticar; para cambios repetibles, define la aplicación en una imagen, un volumen o Compose.

👉 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.

Sintaxis de docker exec

La orden recibe primero las opciones, después el nombre o ID del contenedor y, a continuación, el ejecutable y sus argumentos:

docker exec [OPCIONES] CONTENEDOR COMANDO [ARGUMENTOS...]

Explicación de las opciones

El contenedor debe estar en ejecución y no pausado. COMANDO debe ser un ejecutable que exista dentro de la imagen. Docker no interpreta automáticamente una cadena con varios comandos como si fuera una shell; para encadenarlos, ejecuta un shell disponible y pásale -c.

OpciónFunciónCuándo usarla
-iMantiene abierta la entrada estándar del proceso.Cuando vas a enviar entrada al proceso o abrir una sesión interactiva.
-tAsigna una pseudo-terminal.Junto con -i para una sesión de terminal; no suele hacer falta en scripts.
-u USUARIO[:GRUPO]Ejecuta el proceso con otro usuario o grupo.Cuando necesitas respetar los permisos del contenedor. Usa solo la identidad necesaria.
-w DIRECTORIOCambia el directorio de trabajo de ese proceso.Para ejecutar una orden relativa a una carpeta concreta.
-e VARIABLE=VALORAñade o sustituye una variable de entorno para este proceso.El valor no cambia el entorno de otros procesos del contenedor.
-dEjecuta el proceso de exec en segundo plano.Útil para una acción puntual que no necesita entrada interactiva.

Ejecutar un comando puntual

Este ejemplo crea un Nginx de laboratorio y comprueba su configuración dentro del contenedor. La orden de inspección termina al devolver su resultado, mientras Nginx continúa como proceso principal:

docker run -d --name web-demo nginx:alpine
docker exec web-demo nginx -t

Puedes ejecutar una orden disponible en la imagen, por ejemplo listar el contenido servido por Nginx:

docker exec web-demo ls -la /usr/share/nginx/html

Las imágenes mínimas no siempre incluyen bash, ls u otras utilidades. Si una orden no existe, revisa qué ejecutables incluye la imagen; instalar herramientas durante una sesión de diagnóstico puede ocultar el problema y no es una solución persistente.

Abrir una shell interactiva

Para trabajar manualmente dentro del contenedor, asigna entrada y terminal con -it. Muchas imágenes ligeras incluyen sh aunque no incluyan bash:

docker exec -it web-demo sh

Escribe exit o pulsa Ctrl+D para cerrar esa shell. Solo termina el proceso que abrió exec; el contenedor seguirá activo si su proceso principal continúa ejecutándose.

Ejecutar varios comandos y ajustar el entorno

Si necesitas una secuencia de órdenes, especifica el intérprete y pasa la secuencia con -c. El shell debe existir dentro de la imagen:

docker exec web-demo sh -c 'nginx -t && echo configuracion-valida'

Una variable de entorno pasada con -e solo afecta al proceso que crea esa llamada a exec. No reconfigura el proceso principal ni los procesos que ya se están ejecutando:

docker exec -e DIAGNOSTICO=1 web-demo printenv DIAGNOSTICO

Diferencia entre exec y attach

exec inicia un proceso nuevo dentro del contenedor, como una shell o una herramienta de diagnóstico. attach conecta tu terminal con la entrada y salida del proceso principal existente; las teclas que envías pueden afectar a ese proceso. Para abrir una shell adicional, elige exec.

Errores comunes al usar docker exec

  • El contenedor no está en ejecución: confirma su estado con docker ps -a. Si está detenido y quieres iniciarlo, usa docker start antes de exec.
  • El contenedor está pausado: Docker no puede iniciar el proceso adicional hasta reanudarlo. Comprueba el estado antes de actuar.
  • executable file not found: el comando o la shell no está instalado en esa imagen. Prueba solo un ejecutable que realmente exista; no des por hecho que bash está disponible.
  • Se intenta encadenar comandos directamente: docker exec necesita un ejecutable. Usa sh -c o bash -c únicamente si esa shell está instalada.
  • Se espera que un cambio sobreviva a la recreación: las modificaciones en la capa escribible del contenedor no cambian la imagen y pueden perderse al eliminarlo.
  • Se usa -it en automatización: una pseudo-terminal no suele ser apropiada para scripts; ejecuta la orden sin terminal cuando no necesite interacción.

Lecciones relacionadas del curso Docker

Documentación oficial

Consulta la referencia oficial de docker exec para ver opciones y comportamientos de la versión instalada.

Comentarios

No hay comentarios aún. ¿Por qué no comienzas el debate?

Deja una respuesta

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