Cómo usar el comando docker container wait para esperar hasta que los contenedores se detengan

DockerDockerBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderás a utilizar eficazmente el comando docker container wait. Esta herramienta es poderosa para scripting y automatización, permitiéndote pausar la ejecución hasta que un contenedor específico haya finalizado.

Comenzarás iniciando un contenedor de Docker en segundo plano utilizando el modo desacoplado (-d). Luego, usarás docker container wait para bloquear tu terminal hasta que este contenedor en segundo plano complete su ejecución. Para demostrar el comportamiento de bloqueo, detendrás el contenedor desde una terminal separada. Finalmente, observarás el código de salida devuelto por el comando docker container wait, comprendiendo cómo indica el estado de terminación del contenedor.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/run -.-> lab-555128{{"Cómo usar el comando docker container wait para esperar hasta que los contenedores se detengan"}} docker/ps -.-> lab-555128{{"Cómo usar el comando docker container wait para esperar hasta que los contenedores se detengan"}} docker/stop -.-> lab-555128{{"Cómo usar el comando docker container wait para esperar hasta que los contenedores se detengan"}} docker/pull -.-> lab-555128{{"Cómo usar el comando docker container wait para esperar hasta que los contenedores se detengan"}} end

Iniciar un contenedor en segundo plano

En este paso, aprenderás cómo iniciar un contenedor de Docker en segundo plano. Ejecutar un contenedor en segundo plano permite que opere sin ocupar tu terminal, lo cual es útil para servicios o aplicaciones de larga duración.

Primero, descarguemos la imagen alpine. Esta es una distribución de Linux muy pequeña que resulta útil para pruebas.

docker pull alpine

Deberías ver una salida que indica que la imagen se está descargando.

Using default tag: latest
latest: Pulling from library/alpine
...
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest

Ahora, iniciaremos un contenedor alpine en segundo plano usando la bandera -d. La bandera -d significa "modo desacoplado" (detached mode). También ejecutaremos un comando simple dentro del contenedor, sleep 30, que hará que el contenedor se ejecute durante 30 segundos antes de finalizar.

docker run -d alpine sleep 30

Después de ejecutar este comando, Docker imprimirá el ID completo del contenedor.

<container_id>

Para verificar que el contenedor se está ejecutando en segundo plano, puedes usar el comando docker ps. Este comando lista todos los contenedores actualmente en ejecución.

docker ps

Deberías ver una salida similar a esta, mostrando tu contenedor alpine en ejecución:

CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
<container_id>   alpine    "sleep 30"    X seconds ago   Up X seconds             <container_name>

La columna STATUS debe mostrar Up seguido del tiempo que el contenedor ha estado en ejecución. Esto confirma que el contenedor se está ejecutando en modo desacoplado.

Usar docker container wait para esperar hasta que el contenedor se detenga

En este paso, aprenderás a utilizar el comando docker container wait. Este comando se bloquea hasta que uno o más contenedores se detengan y luego imprime sus códigos de salida. Esto es útil cuando necesitas esperar que un proceso en segundo plano dentro de un contenedor finalice antes de continuar con otras tareas.

Primero, obtengamos el ID del contenedor que iniciamos en el paso anterior. Podemos usar docker ps -q para obtener solo el ID del contenedor en ejecución.

docker ps -q

Este comando mostrará el ID del contenedor. Copia este ID ya que lo necesitarás para el siguiente comando.

<container_id>

Ahora, usa el comando docker container wait seguido del ID del contenedor que acabas de obtener.

docker container wait <container_id>

Al ejecutar este comando, tu terminal parecerá quedarse bloqueada. Este es el comportamiento esperado. El comando docker container wait es bloqueante, lo que significa que pausará la ejecución hasta que el contenedor especificado se detenga. Como el contenedor está ejecutando el comando sleep 30, este comando esperará hasta 30 segundos a que el contenedor finalice.

Una vez que el contenedor se detenga (ya sea al completar su comando sleep 30 o al ser detenido manualmente), el comando docker container wait se desbloqueará e imprimirá el código de salida del contenedor.

Por ejemplo, si el contenedor se detiene exitosamente después de 30 segundos, verás:

0

Un código de salida 0 típicamente indica que el comando dentro del contenedor se completó exitosamente.

Mantén esta ventana de terminal abierta, ya que interactuaremos con este comando de espera en el siguiente paso.

Detener el contenedor en otra terminal

En este paso, abrirás una nueva terminal y detendrás el contenedor en ejecución. Esto demostrará cómo reacciona docker container wait en la primera terminal cuando el contenedor se detiene externamente.

Abre una nueva ventana de terminal en el entorno LabEx. Normalmente puedes hacer esto haciendo clic en el icono "+" o seleccionando "Nueva Terminal" en un menú.

En esta nueva terminal, necesitamos identificar nuevamente el contenedor en ejecución. Usa docker ps para listar los contenedores activos y encontrar el ID del contenedor.

docker ps

Verás una salida similar al paso anterior, mostrando el ID del contenedor, la imagen, el comando, etc.

CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
<container_id>   alpine    "sleep 30"    X minutes ago   Up X minutes             <container_name>

Ahora, usa el comando docker stop seguido del ID del contenedor para detenerlo.

docker stop <container_id>

Deberías ver el ID del contenedor impreso nuevamente en la terminal, indicando que el comando de detención fue exitoso.

<container_id>

Regresa a la primera ventana de terminal donde ejecutaste docker container wait. Deberías observar que el comando docker container wait ha finalizado y ha impreso un código de salida. Examinaremos este código de salida en el siguiente paso.

Observar el código de salida de docker container wait

En este paso final, examinaremos el código de salida que imprimió el comando docker container wait en la primera terminal.

Regresa a la primera ventana de terminal donde ejecutaste el comando docker container wait <container_id>.

Deberías ver un número impreso en la línea después del comando. Este número es el código de salida del contenedor.

137

En el paso anterior, detuviste el contenedor usando docker stop. Cuando un contenedor se detiene con docker stop, Docker envía una señal SIGTERM al proceso principal del contenedor, y después de un período de gracia, una señal SIGKILL si el proceso no ha terminado. Un código de salida 137 es un indicador común de que un proceso fue terminado por una señal SIGKILL (128 + 9, donde 9 es el número de señal para SIGKILL).

Esto demuestra que docker container wait no solo espera a que el contenedor se detenga, sino que también proporciona el código de salida, que puede darte información sobre cómo terminó el contenedor. Si el contenedor hubiera completado su comando sleep 30 naturalmente, el código de salida habría sido 0.

Puedes verificar que el contenedor está detenido ejecutando docker ps -a en cualquiera de las terminales. La bandera -a muestra todos los contenedores, incluidos los detenidos.

docker ps -a

Deberías ver tu contenedor alpine listado, y su estado debería ser Exited (<exit_code>).

CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                      PORTS     NAMES
<container_id>   alpine    "sleep 30"    X minutes ago    Exited (137) X seconds ago             <container_name>

Esto concluye el laboratorio sobre el uso de docker container wait. Has aprendido cómo iniciar un contenedor en segundo plano, esperar a que se detenga usando docker container wait, detenerlo desde otra terminal y observar el código de salida resultante.

Resumen

En este laboratorio, aprendiste cómo iniciar un contenedor Docker en segundo plano usando el flag -d y el comando docker run, verificando su estado con docker ps. También comenzaste a explorar el comando docker container wait, comprendiendo su propósito de bloquear la ejecución hasta que un contenedor específico se detenga y luego devolver su código de salida.