Contenido

Tutorial de docker exec: ejecuta comandos en un contenedor en marcha

docker exec ejecuta un comando dentro de un contenedor en marcha. Se usa sobre todo para entrar en un contenedor e investigar un problema. Para el flujo completo de depuración, consulta Ver registros y depurar.

Sintaxis

docker exec [OPCIONES] CONTENEDOR COMANDO [ARG...]
docker exec -it web sh        # Entrar en la shell del contenedor
docker exec web nginx -t      # Ejecutar un comando y ver su salida

Opciones

docker exec no tiene muchas opciones. Estas son todas las que muestra docker exec --help:

OpciónDescripción
-i, --interactiveMantiene abierta la entrada estándar para que puedas escribir
-t, --ttyAsigna una terminal. Para sesiones interactivas se combina con -i: -it
-u, --user USUARIO[:GRUPO]Ejecuta como el usuario indicado (nombre o UID)
-w, --workdir RUTAEjecuta en el directorio indicado dentro del contenedor
-e, --env NOMBRE=VALORDefine una variable de entorno para este comando
--env-file ARCHIVOLee variables de entorno de un archivo
-d, --detachEjecuta en segundo plano y vuelve de inmediato
--privilegedDa privilegios adicionales a este comando (para depurar; no lo uses de forma habitual)
--detach-keysCambia la combinación de teclas para desconectarse (por defecto: Ctrl+P, Ctrl+Q)

Todos los ejemplos siguientes usan un contenedor nginx llamado web, iniciado con la variable de entorno APP_MODE=demo:

docker run -d --name web -e APP_MODE=demo nginx:1.30-alpine

Ejecutar un comando

$ docker exec web nginx -v
nginx version: nginx/1.30.5

$ docker exec web sh -c "ls /etc/nginx/conf.d && echo \$APP_MODE"
default.conf
demo
  • El primer comando ejecuta nginx -v en el contenedor y muestra el resultado directamente.
  • Para usar &&, tuberías o variables, pasa el comando a la shell del contenedor con sh -c "...". La \ de \$APP_MODE evita que la shell del host expanda la variable antes; demo es el valor dentro del contenedor.

Entrar en un contenedor de forma interactiva

docker exec -it web sh

Al entrar, el prompt cambia a / # y puedes trabajar como en cualquier entorno Linux. Escribe exit para salir; el contenedor sigue en marcha. Si la imagen incluye bash, puedes usar bash en su lugar.

-u, -w y -e

$ docker exec -u nginx web id
uid=101(nginx) gid=101(nginx) groups=101(nginx)

$ docker exec -w /usr/share/nginx/html web ls
50x.html
index.html

$ docker exec -e GREETING=hi web sh -c "echo \$GREETING"
hi
  • -u nginx: ejecuta como el usuario nginx (el contenedor usa root por defecto). Sirve para revisar problemas de permisos de archivos.
  • -w /usr/share/nginx/html: ejecuta en el directorio indicado, como si hubieras hecho cd antes.
  • -e GREETING=hi: define una variable de entorno solo para este comando. No cambia el contenedor.

-d: ejecutar en segundo plano

$ docker exec -d web sh -c "sleep 2; touch /tmp/done"

$ docker exec web ls /tmp
done

-d ejecuta el comando en segundo plano y vuelve de inmediato. Al comprobarlo 2 segundos después, /tmp/done ya existe. Sirve para lanzar tareas cuyo resultado no necesitas esperar.

El contenedor no está en marcha

$ docker stop web
web

$ docker exec web ls
Error response from daemon: container 1ec4fdc5c592b09b64e8f28869c37f89ab17163f88bfcb09e82815a44b0e1164 is not running

docker exec solo funciona con contenedores en marcha. Inicia un contenedor detenido con docker start. Si el contenedor se cierra nada más arrancar, no puedes entrar con exec: revisa docker logs o inicia un contenedor nuevo para inspeccionarlo con docker run --rm -it --entrypoint sh IMAGEN.

Capítulos relacionados

Ejercicios

Ejercicio: con un solo comando, lista los archivos de /etc/nginx del contenedor web como el usuario nginx.

Respuesta
docker exec -u nginx -w /etc/nginx web ls

Preguntas frecuentes

¿Qué diferencia hay entre docker exec y docker run?

docker run usa una imagen para **crear un contenedor nuevo**; docker exec ejecuta otro proceso dentro de un **contenedor que ya está en marcha**. Cuando exec termina, el contenedor no se ve afectado.

¿Por qué docker exec -it contenedor bash devuelve executable file not found?

El contenedor no tiene bash. Por ejemplo, las imágenes basadas en Alpine solo incluyen sh. Usa docker exec -it contenedor sh en su lugar.

¿Se conservan los archivos que modifico en un contenedor después de recrearlo?

No. Los cambios hechos con exec están en la capa de escritura del contenedor y desaparecen al eliminarlo. Lo que necesites conservar va en el Dockerfile o en un Volume.

Actualizado 14 de octubre de 2026