Как использовать команду docker container wait для ожидания остановки контейнеров

DockerDockerBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этой лабораторной работе вы научитесь эффективно использовать команду docker container wait. Эта команда является мощным инструментом для написания скриптов и автоматизации, позволяя приостановить выполнение до тех пор, пока указанный контейнер не завершит работу.

Вы начнёте с запуска Docker-контейнера в фоновом режиме с использованием detached mode (-d). Затем вы воспользуетесь командой 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

Теперь мы запустим контейнер alpine в фоновом режиме, используя флаг -d (от англ. "detached mode"). Внутри контейнера выполним простую команду sleep 30, которая заставит контейнер работать 30 секунд перед завершением.

docker run -d alpine sleep 30

После выполнения этой команды Docker выведет полный идентификатор контейнера.

<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 с продолжительностью работы контейнера. Это подтверждает, что контейнер запущен в detached mode.

Использование docker container wait для ожидания остановки контейнера

На этом шаге вы узнаете, как использовать команду docker container wait. Эта команда блокирует выполнение до остановки одного или нескольких контейнеров, а затем выводит их коды завершения. Это полезно, когда вам нужно дождаться завершения фонового процесса в контейнере перед выполнением других задач.

Сначала получим ID контейнера, который мы запустили на предыдущем шаге. Используем docker ps -q для получения только ID запущенного контейнера.

docker ps -q

Эта команда выведет 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. Обычно это можно сделать, нажав на значок "+" или выбрав "New Terminal" в меню.

В новом терминале нам снова нужно определить работающий контейнер. Используйте 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 завершена. Вы научились:

  • Запускать контейнер в фоновом режиме
  • Ожидать его остановки с помощью docker container wait
  • Останавливать контейнер из другого терминала
  • Анализировать полученный код завершения

Итоги

В этой лабораторной работе вы научились:

  • Запускать Docker-контейнер в фоновом режиме с использованием флага -d и команды docker run
  • Проверять его состояние с помощью docker ps
  • Изучили команду docker container wait, поняв её назначение - блокировать выполнение до остановки указанного контейнера с последующим возвратом кода завершения.