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ón | Descripción |
|---|---|
-i, --interactive | Mantiene abierta la entrada estándar para que puedas escribir |
-t, --tty | Asigna una terminal. Para sesiones interactivas se combina con -i: -it |
-u, --user USUARIO[:GRUPO] | Ejecuta como el usuario indicado (nombre o UID) |
-w, --workdir RUTA | Ejecuta en el directorio indicado dentro del contenedor |
-e, --env NOMBRE=VALOR | Define una variable de entorno para este comando |
--env-file ARCHIVO | Lee variables de entorno de un archivo |
-d, --detach | Ejecuta en segundo plano y vuelve de inmediato |
--privileged | Da privilegios adicionales a este comando (para depurar; no lo uses de forma habitual) |
--detach-keys | Cambia 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 -ven el contenedor y muestra el resultado directamente. - Para usar
&&, tuberías o variables, pasa el comando a la shell del contenedor consh -c "...". La\de\$APP_MODEevita que la shell del host expanda la variable antes;demoes 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 usuarionginx(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 hechocdantes.-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
- Ver registros y depurar
- Opciones de docker run
- docker cp: copiar archivos entre el host y un contenedor
- Mensajes de error comunes:
executable file not found, errores de TTY
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