Почему вообще возник такой вопрос
Docker был разработан, чтобы запускать предварительно сконфигурированное программное обеспечение полностью изолированно, в так называемой «песочнице». С одной стороны, такой подход обеспечивает полную идемпотентность, у нас есть гарантия, что программное обеспечение не зависит от внешней среды и его «поведение» всегда одинаково. С другой стороны, Docker останавливается, когда завершают свою работу запущенные внутри образа команды. Пример. Работа контейнера сразу остановится после выполнения команды ниже:
docker run <имя_образа> <команда> # Запуск команды
docker ps # Вывод списка работающих контейнеров
Такое поведение Docker – не ошибка, оно обусловлено экономией системных ресурсов. Однако иногда контейнер должен работать постоянно, например, если программное обеспечение должно постоянно ждать «входящие» соединения.
Как «заставить» контейнер Docker работать постоянно
Вы можете достигнуть эту цель несколькими способами:
Запуск «дополнительной» сессии псевдотерминала. Такой способ хорош, если поддерживать работу Docker-контейнера нужно не постоянно, а лишь время от времени. Достаточно просто запустить команду с флагами -it:
docker run -it <имя_образа> bash # Запуск сессии командного интерпретатора
<команда> # Запуск команды или скрипта «внутри» контейнера
docker ps # Вывод списка работающих контейнеров
Другой способ не дать контейнеру выключиться – выполнение любой команды «в цикле». После запуска команды можно закрыть сеанс терминала:
docker run <имя_образа> bash -c <команда>
Затем просто проверьте статус контейнера:
docker ps
Тот же самый результат можно получить, если запустить докер в «непривязанном» режиме. Для этого используйте флаг -d:
docker run -d <имя_образа> bash -c <команда> # Запуск команды
docker ps # Вывод списка работающих контейнеров
Заключение
Прочитав эту статью, вы узнали, как сохранить докер-контейнер работающим, даже если запущенные «внутри» него команды завершились.