Мне не удалось найти явного объяснения этому на сайте докера, но для меня это выглядит следующим образом.
Во-первых, когда вы запускаете свой контейнер (docker run
), докер выделяет основной процесс (PID 1
) для этого и контейнер считается живым, пока этот процесс не завершается.Этот процесс имеет свои собственные stdin
, stdout
и stderr
, которые, между прочим, подключены к вашей консоли (флаг -it
).
Это обработчики, которые собираются и регистрируются демоном docker.
Когда вы запускаете docker exec
, он создает новый процесс в контейнере, и этот новый процесс не наследует ioобработчики (stdin
, stdout
и stderr
) из PID 1
.Итак, все новые сеансы, созданные docker exec
, по-видимому, имеют свои собственные, отдельные потоки, которые не регистрируются демоном.