如何使用 docker container wait 命令阻塞直到容器停止

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习如何高效使用 docker container wait 命令。该命令是脚本编写和自动化场景下的强大工具,能让你暂停当前执行流程,直到指定容器停止运行。

你将首先通过 detached 模式(-d)在后台启动一个 Docker 容器。接着使用 docker container wait 命令阻塞当前终端,直到该后台容器完成执行。为演示阻塞效果,你需要从另一个终端手动停止该容器。最后观察 docker container wait 命令返回的退出代码,理解其如何反映容器的终止状态。


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{{"如何使用 docker container wait 命令阻塞直到容器停止"}} docker/ps -.-> lab-555128{{"如何使用 docker container wait 命令阻塞直到容器停止"}} docker/stop -.-> lab-555128{{"如何使用 docker container wait 命令阻塞直到容器停止"}} docker/pull -.-> lab-555128{{"如何使用 docker container wait 命令阻塞直到容器停止"}} end

在后台启动容器

在本步骤中,你将学习如何在后台启动 Docker 容器。后台运行容器可以让其在不占用终端的情况下持续运行,这对于长期运行的服务或应用程序非常有用。

首先,让我们拉取 alpine 镜像。这是一个非常小的 Linux 发行版镜像,非常适合测试用途。

docker pull alpine

你将看到镜像正在被拉取和下载的输出信息。

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

现在,我们将使用 -d 参数在后台启动一个 alpine 容器。-d 参数表示「分离模式(detached mode)」。我们还会在容器内运行一个简单命令 sleep 30,这将使容器运行 30 秒后自动退出。

docker run -d alpine sleep 30

执行该命令后,Docker 会打印完整的容器 ID。

<container_id>

要验证容器是否正在后台运行,可以使用 docker ps 命令。该命令会列出所有当前正在运行的容器。

docker ps

你应该能看到类似以下的输出,显示你的 alpine 容器正在运行:

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

STATUS 列会显示 Up 以及容器已运行的时长,这确认了容器正在以分离模式运行。

使用 docker container wait 命令阻塞至容器停止

在本步骤中,你将学习如何使用 docker container wait 命令。该命令会阻塞当前进程,直到一个或多个容器停止运行,然后输出它们的退出代码。当需要等待容器中的后台进程完成后再执行其他任务时,这个命令非常有用。

首先,让我们获取上一步启动的容器 ID。可以使用 docker ps -q 命令仅获取运行中容器的 ID。

docker ps -q

该命令将输出容器 ID。请复制这个 ID,后续命令会用到它。

<container_id>

现在,使用 docker container wait 命令并跟上你刚获取的容器 ID。

docker container wait <container_id>

执行此命令后,你的终端会看似卡住。这是预期行为。docker container wait 命令具有阻塞特性,意味着它会暂停执行直到指定容器停止。由于当前容器正在执行 sleep 30 命令,该命令最多会等待 30 秒直到容器运行结束。

当容器停止后(无论是完成 sleep 30 命令还是被手动停止),docker container wait 命令将解除阻塞并输出容器的退出代码。

例如,如果容器在 30 秒后成功停止,你将看到:

0

退出代码 0 通常表示容器内的命令已成功完成。

请保持这个终端窗口开启,我们将在下一步骤中与这个等待命令进行交互。

在另一个终端中停止容器

在本步骤中,你将打开一个新终端并停止正在运行的容器。这将演示当容器被外部停止时,第一个终端中的 docker container wait 命令会如何响应。

在 LabEx 环境中打开一个 新终端窗口。通常可以通过点击"+"图标或从菜单中选择"新建终端"来实现。

在这个新终端中,我们需要再次确认正在运行的容器。使用 docker ps 命令列出运行中的容器并找到容器 ID。

docker ps

你将看到与上一步类似的输出,显示容器 ID、镜像、命令等信息。

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

现在,使用 docker stop 命令后跟容器 ID 来停止容器。

docker stop <container_id>

你应该会看到终端打印出容器 ID,表示停止命令已成功执行。

<container_id>

切换回 第一个终端窗口,即你运行 docker container wait 的地方。此时你应该观察到 docker container wait 命令已经完成执行并输出了一个退出代码。我们将在下一步骤中分析这个退出代码。

观察 docker container wait 的退出代码

在这最后一步中,我们将分析第一个终端中 docker container wait 命令输出的退出代码。

切换回 第一个终端窗口,即你运行 docker container wait <container_id> 命令的地方。

你应该会在命令执行后的行中看到一个数字。这个数字就是容器的退出代码。

137

在上一步中,你使用 docker stop 停止了容器。当使用 docker stop 停止容器时,Docker 会向容器中的主进程发送 SIGTERM 信号,如果在宽限期内进程没有退出,则会发送 SIGKILL 信号。退出代码 137 通常表示进程是被 SIGKILL 信号终止的(128 + 9,其中 9 是 SIGKILL 的信号编号)。

这证明了 docker container wait 不仅会等待容器停止,还会提供退出代码,这些信息可以帮助你了解容器是如何停止的。如果容器自然完成了 sleep 30 命令,退出代码应该是 0

你可以在任意终端中运行 docker ps -a 来验证容器是否已停止。-a 参数会显示所有容器,包括已停止的。

docker ps -a

你应该能看到你的 alpine 容器被列出,其状态应为 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>

至此,关于使用 docker container wait 的实验就完成了。你已经学会了如何:

  1. 在后台启动容器
  2. 使用 docker container wait 等待容器停止
  3. 从另一个终端停止容器
  4. 观察最终的退出代码

总结

在本实验中,你学习了如何使用 -d 参数和 docker run 命令在后台启动 Docker 容器,并通过 docker ps 验证其运行状态。你还初步探索了 docker container wait 命令,理解了它的作用是在指定容器停止前阻塞执行,并在容器停止后返回其退出代码。