Cómo usar docker exec para ejecutar comandos en un contenedor Docker

0 acciones
0
0
0
0

Introducción

Docker es una herramienta de contenedorización que ayuda a los desarrolladores a crear y administrar contenedores portátiles compatibles con Linux.

Al desarrollar o implementar contenedores, a menudo es necesario revisar el interior de un contenedor en ejecución para comprobar su estado actual o solucionar un problema. Para ello, Docker proporciona el comando docker exec para ejecutar aplicaciones en contenedores en ejecución.

En este tutorial, aprenderemos sobre el comando docker exec y cómo usarlo para ejecutar comandos y obtener un shell interactivo en un contenedor Docker.

Requisitos previos

Este tutorial asume que ya ha instalado Docker y que su usuario tiene permiso para ejecutarlo. Si necesita ejecutar Docker como root, recuerde agregar "sudo" a los comandos de este tutorial.

Para obtener más información sobre cómo usar Docker sin acceso a sudo, consulte la sección Ejecutar un comando Docker sin sudo en nuestro tutorial Cómo instalar Docker.

Lanzamiento de un contenedor de prueba

Para usar el comando docker exec, necesita un contenedor Docker en ejecución. Si aún no tiene uno, inicie un contenedor de prueba con el siguiente comando docker exec:

docker run -d --name container-name alpine watch "date >> /var/log/date.log"

Este comando crea un nuevo contenedor Docker a partir de la imagen oficial de Alpine. Esta es una imagen de contenedor de Linux popular que utiliza Alpine Linux, una distribución de Linux ligera y minimalista.

Usamos el parámetro -d para separar el contenedor de la terminal y ejecutarlo en segundo plano. --name container-name asigna un nombre al contenedor. Puedes elegir el nombre que prefieras o omitirlo para que Docker genere automáticamente un nombre único para el nuevo contenedor.

A continuación tenemos alpine que especifica la imagen que queremos usar para el contenedor.

Finalmente, tenemos "date >> /var/log/date.log". Este es el comando que queremos ejecutar en el contenedor. Por defecto, el reloj ejecutará el comando que le des cada dos segundos. El comando que ejecutará el reloj en este caso es date >> /var/log/date.log. date imprime la fecha y hora actuales, así:

Output
Fri Jul 23 14:57:05 UTC 2021

La sección >> /var/log/date.log redirige la salida del comando date y la añade al archivo /var/log/date.log. Cada dos segundos se añade una nueva línea al archivo, y después de unos segundos tendrá un aspecto similar a este:

Output
Fri Jul 23 15:00:26 UTC 2021
Fri Jul 23 15:00:28 UTC 2021
Fri Jul 23 15:00:30 UTC 2021
Fri Jul 23 15:00:32 UTC 2021
Fri Jul 23 15:00:34 UTC 2021

A continuación, aprenderemos a encontrar los nombres de los contenedores Docker. Esto será útil si ya tienes un contenedor al que te diriges, pero no estás seguro de su nombre.

Encontrar el nombre del contenedor Docker

Necesitamos proporcionar a docker exec el nombre (o ID del contenedor) del contenedor con el que queremos trabajar. Podemos encontrar esta información usando el comando docker ps:

docker ps

Este comando enumera todos los contenedores Docker que se ejecutan en el servidor y proporciona información de alto nivel sobre ellos:

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
76aded7112d4 alpine "watch 'date >> /var…" 11 seconds ago Up 10 seconds container-name

En este ejemplo, se resaltan el ID y el nombre del contenedor. Puedes usar cualquiera de ellos para indicarle a Docker Exec qué contenedor usar.

Si desea cambiar el nombre de su contenedor, utilice el comando docker rename:

docker rename container-name new-name

A continuación, ejecutaremos varios ejemplos de uso de docker exec para ejecutar comandos en un contenedor Docker.

Ejecución de un shell interactivo en un contenedor Docker

Si necesita iniciar un shell interactivo dentro de un contenedor Docker, tal vez para explorar el sistema de archivos o depurar procesos en ejecución, utilice docker exec con los indicadores -i y -t.

La opción -i mantiene abierta la entrada al contenedor, y la opción -t crea una pseudoterminal a la que el shell puede conectarse. Estas opciones se pueden combinar de la siguiente manera:

docker exec -it container-name sh

Esto ejecutará el shell en el contenedor especificado y le mostrará un mensaje inicial. Para salir del contenedor, escriba exit y INGRESAR Prensa:

exit

Si la imagen de su contenedor incluye un shell más avanzado como bash, puede reemplazar sh con bash arriba.

Ejecutar un comando no interactivo en un contenedor Docker

Si necesita ejecutar un comando dentro de un contenedor en ejecución, pero no necesita interactuar, use el comando docker exec sin ninguna bandera:

docker exec container-name tail /var/log/date.log

Este comando ejecutará tail /var/log/date.log en el contenedor `nombre del contenedor` e imprimirá los resultados. De forma predeterminada, el comando `tail` imprime las últimas diez líneas de un archivo. Si ejecuta el contenedor de prueba que configuramos en la primera sección, verá algo similar a esto:

Output
Mon Jul 26 14:39:33 UTC 2021
Mon Jul 26 14:39:35 UTC 2021
Mon Jul 26 14:39:37 UTC 2021
Mon Jul 26 14:39:39 UTC 2021
Mon Jul 26 14:39:41 UTC 2021
Mon Jul 26 14:39:43 UTC 2021
Mon Jul 26 14:39:45 UTC 2021
Mon Jul 26 14:39:47 UTC 2021
Mon Jul 26 14:39:49 UTC 2021
Mon Jul 26 14:39:51 UTC 2021

Esto es básicamente lo mismo que abrir un shell interactivo para el contenedor Docker (como se hizo en el paso anterior con docker exec -it container-name sh) y luego ejecutar el comando tail /var/log/date.log. Sin embargo, en lugar de abrir un shell, ejecutar el comando y luego cerrarlo, este comando devuelve la misma salida en un solo comando sin abrir una pseudoterminal.

Ejecutar comandos en un directorio alternativo en un contenedor Docker

Para ejecutar un comando en un directorio específico de su contenedor, use el indicador –workdir para especificar el directorio:

docker exec --workdir /tmp container-name pwd

Este comando de ejemplo establece el directorio /tmp como el directorio de trabajo, luego ejecuta el comando pwd, que imprime el directorio de trabajo actual:

Output
/tmp

El comando pwd ha confirmado que el directorio de trabajo es /tmp.

Ejecutar comandos como un usuario diferente en un contenedor Docker

Para ejecutar un comando como un usuario diferente dentro de su contenedor, agregue el indicador --user:

docker exec --user guest container-name whoami

Esto utiliza al usuario invitado para ejecutar el comando whoami en el contenedor. El comando whoami imprime el nombre de usuario actual del usuario:

Output
guest

El comando whoami confirma que el usuario actual del contenedor es el invitado.

Pasar variables de entorno a un contenedor Docker

A veces es necesario pasar variables de entorno a un contenedor junto con el comando de ejecución. El indicador -e permite especificar una variable de entorno:

docker exec -e TEST=sammy container-name env

Este comando establece la variable de entorno TEST en sammy y luego ejecuta el comando env dentro del contenedor. El comando env imprime todas las variables de entorno:

Output
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=76aded7112d4
TEST=sammy
HOME=/root

La variable TEST se establece en sammy.

Para configurar varias variables, repita el comando -e para cada una:

docker exec -e TEST=sammy -e ENVIRONMENT=prod container-name env

Si desea pasar un archivo lleno de variables de entorno, puede hacerlo con el indicador –env-file.

Primero, crea el archivo con un editor de texto. Abriremos un nuevo archivo con nano, pero puedes usar cualquier editor que te resulte cómodo:

nano .env

Usamos .env como nombre de archivo porque es un estándar popular para usar este tipo de archivos para administrar información fuera del control de versiones.

Escriba sus variables KEY=value en el archivo, una por línea, como se muestra a continuación:

TEST=sammy
ENVIRONMENT=prod

Guarde y cierre el archivo. Para guardar el archivo y salir de nano, presione CTRL+O, luego ENTER para guardar y CTRL+X para salir.

Ahora ejecute el comando docker exec y especifique el nombre de archivo correcto después de –env-file:

docker exec --env-file .env container-name env
Output
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=76aded7112d4
TEST=sammy
ENVIRONMENT=prod
HOME=/root

Se establecen dos variables en el archivo.

Puede especificar varios archivos con varios indicadores –env-file. Si las variables de los archivos se superponen, el archivo incluido en el último comando sobrescribirá los archivos anteriores.

Errores comunes

Al utilizar el comando docker exec, es posible que encuentre algunos errores comunes:

Error: No such container: container-name

El error "No existe dicho contenedor" significa que el contenedor especificado no existe y puede indicar un error ortográfico en su nombre. Use docker ps para listar los contenedores en ejecución y verificar el nombre.

Error response from daemon: Container 2a94aae70ea5dc92a12e30b13d0613dd6ca5919174d73e62e29cb0f79db6e4ab is not running

Este mensaje en ejecución significa que el contenedor existe, pero está detenido. Puede iniciarlo con docker start container-name.

Error response from daemon: Container container-name is paused, unpause the container before exec

El error "Contenedor en pausa" explica bien el problema. Antes de continuar, debe reactivar el contenedor con docker unpause container-name.

Resultado

En este tutorial aprendimos cómo ejecutar comandos en un contenedor Docker en ejecución, junto con algunas opciones de línea de comandos al hacerlo.

Para obtener más información sobre Docker en general, visita nuestra página de etiquetas Docker, que tiene enlaces a tutoriales de Docker, páginas de preguntas y respuestas relacionadas con Docker y más.

Deja una respuesta

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

También te puede gustar