docker container exec
| Descripción | Ejecuta un comando en un contenedor en ejecución |
|---|---|
| Uso | docker container exec [OPTIONS] CONTAINER COMMAND [ARG...] |
| Alias | docker exec |
Descripción
El comando docker exec ejecuta un nuevo comando en un contenedor que ya está en funcionamiento.
El comando que especifiques con docker exec solo se ejecutará mientras el proceso
primario del contenedor (PID 1) esté activo, y no se volverá a ejecutar si el
contenedor se reinicia.
El comando se ejecuta en el directorio de trabajo por defecto del contenedor.
El comando debe ser un ejecutable. Un comando encadenado o entre comillas no funcionará.
- Esto funciona:
docker exec -it mi_contenedor sh -c "echo a && echo b" - Esto no funciona:
docker exec -it mi_contenedor "echo a && echo b"
Opciones
| Opción | Predeterminado | Descripción |
|---|---|---|
-d, --detach | Modo desasociado (detached): ejecuta el comando en segundo plano | |
--detach-keys | Invalida la secuencia de teclas para desasociar un contenedor | |
-e, --env | API 1.25+ Establece variables de entorno | |
--env-file | API 1.25+ Lee variables de entorno desde un archivo | |
-i, --interactive | Mantiene STDIN abierto incluso si no está asociado | |
--privileged | Otorga privilegios extendidos al comando | |
-t, --tty | Asigna una pseudo-TTY | |
-u, --user | Nombre de usuario o UID (formato: <nombre|uid>[:<grupo|gid>]) | |
-w, --workdir | API 1.35+ Directorio de trabajo dentro del contenedor |
Ejemplos
Ejecutar docker exec en un contenedor en funcionamiento
Primero, inicia un contenedor.
$ docker run --name mycontainer -d -i -t alpine /bin/sh
Esto crea e inicia un contenedor llamado mycontainer a partir de una imagen alpine
con un intérprete de comandos sh como su proceso principal. La opción -d (abreviatura de --detach)
hace que el contenedor se ejecute en segundo plano, en modo desasociado, con una pseudo-TTY
conectada (-t). Se define la opción -i para mantener STDIN conectado, lo que
evita que el proceso sh finalice inmediatamente.
Luego, ejecuta un comando en el contenedor.
$ docker exec -d mycontainer touch /tmp/execWorks
Esto crea un nuevo archivo /tmp/execWorks dentro del contenedor en ejecución
mycontainer, en segundo plano.
A continuación, ejecuta un shell interactivo sh en el contenedor.
$ docker exec -it mycontainer sh
Esto inicia una nueva sesión de shell en el contenedor mycontainer.
Establecer variables de entorno para el proceso exec (--env, -e)
La instrucción docker exec hereda las variables de entorno que se definen al
momento de crear el contenedor. Usa --env (o la abreviatura -e) para
sobrescribir variables de entorno globales, o para establecer variables de entorno
adicionales para el proceso iniciado por docker exec.
El siguiente ejemplo crea una nueva sesión de shell en el contenedor mycontainer,
con las variables de entorno $VAR_A establecida en 1 y $VAR_B establecida en 2.
Estas variables de entorno solo son válidas para el proceso sh iniciado por ese
comando docker exec, y no están disponibles para otros procesos que se ejecuten dentro
del contenedor.
$ docker exec -e VAR_A=1 -e VAR_B=2 mycontainer env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=f64a4851eb71
VAR_A=1
VAR_B=2
HOME=/root
Escalar privilegios del contenedor (--privileged)
Consulta
docker run --privileged.
Establecer el directorio de trabajo para el proceso exec (--workdir, -w)
Por defecto, el comando docker exec se ejecuta en el mismo directorio de trabajo definido cuando
se creó el contenedor.
$ docker exec -it mycontainer pwd
/
Puedes especificar un directorio de trabajo alternativo para que se ejecute el comando
usando la opción --workdir (o la abreviatura -w):
$ docker exec -it -w /root mycontainer pwd
/root
Intentar ejecutar docker exec en un contenedor pausado
Si el contenedor está pausado, el comando docker exec fallará con un error:
$ docker pause mycontainer
mycontainer
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
482efdf39fac alpine "/bin/sh" 17 seconds ago Up 16 seconds (Paused) mycontainer
$ docker exec mycontainer sh
Error response from daemon: Container mycontainer is paused, unpause the container before exec
$ echo $?
1