Регистрация контейнеров в Docker - PullRequest
0 голосов
/ 18 января 2019

Что-то я не понимаю в журналах Docker.

Читая документацию, я вижу, что по умолчанию Docker использует драйвер ведения журнала JSON File.

По умолчанию Docker записывает стандартный вывод (и стандартную ошибку) всех ваших контейнеров и записывает их в файлы в формате JSON

Итак, если я делаю

docker run -it --name log1 alpine:latest

сопровождаемый (так внутри контейнера) простым ps -ef, я могу увидеть результат команды в журналах, используя docker logs log1

Теперь я продолжаю контейнер работать. Если в другой сессии я делаю

docker exec -it log1 ps -ef

больше ничего не приходит в журналах.

Даже с

docker exec -it log1 sh

ps -ef (внутри контейнера) ничего не выдает в логах.

Возвращаясь к 1-му сеансу, все выходные команды снова регистрируются.

Что я неправильно понимаю?

1 Ответ

0 голосов
/ 18 января 2019

Мне не удалось найти явного объяснения этому на сайте докера, но для меня это выглядит следующим образом.

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

Это обработчики, которые собираются и регистрируются демоном docker.

Когда вы запускаете docker exec, он создает новый процесс в контейнере, и этот новый процесс не наследует ioобработчики (stdin, stdout и stderr) из PID 1.Итак, все новые сеансы, созданные docker exec, по-видимому, имеют свои собственные, отдельные потоки, которые не регистрируются демоном.

...