Существует ли минимальное условие для продолжения работы контейнера?

Почему контейнер закрывается, когда точка входа указывает на выполнение команды в фоновом режиме? Например, если я бегу 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с, разве это не интересно.)

Другие вопросы по тегам