Существует ли минимальное условие для продолжения работы контейнера?
Почему контейнер закрывается, когда точка входа указывает на выполнение команды в фоновом режиме? Например, если я бегу docker run -d ubuntu bash -c "sleep 12000&"
контейнер выходит. Если я бегу docker run -d ubuntu bash -c "sleep 12000"
контейнер продолжает работать.
Разве не достаточно процесса в фоновом режиме, чтобы контейнер работал?
Почему sleep
бег на заднем или переднем плане влияет на это?
3 ответа
Согласно заявлению Докера, контейнер должен работать, пока
основной процесс контейнера (PID 1) выполняется
В вашем случае первичный процесс bash
и контейнер "работает", пока этот процесс не завершится.
Как подсказывает виноград, условие состоит в том, что PID 1 работает.
Контейнер спроектирован так, чтобы быть недолговечным и специализироваться на одной задаче (микросервис), которая запускается как PID 1 на переднем плане. Фон, конечно, полезен для таких вещей, как ssh, но контейнер должен иметь основную работу.
Большинство услуг может быть запущено как на переднем, так и на заднем плане (деамонизировано)
PS. если вы хотите сохранить контейнер, используйте tail -f /dev/null
как CMD
Простым критерием может быть следующий: если вы запускаете команду локально, и она сразу же возвращается и возвращает вам приглашение оболочки, тогда, если вы запустите эту команду как основной процесс в контейнере, контейнер немедленно закроется.
Обычно рекомендуется, чтобы контейнер выполнял какой-то процесс, например сетевой сервер, в качестве процесса переднего плана, и когда этот сервер завершает работу, контейнер завершается. В идеальном случае контейнер полностью автономен: как только вы docker run
это, он делает свое дело без какого-либо вмешательства пользователя. (В этой модели простой контейнер Ubuntu без установленного программного обеспечения, который только sleep
с, разве это не интересно.)