Перенаправление вывода скрипта в журналы докера - PullRequest
0 голосов
/ 31 марта 2019

У меня есть скрипт node.js, работающий в контейнере Docker узлов, который в настоящее время выводит свои выходные данные в файл журнала внутри контейнера и STDOUT.Многие официальные образы докера позволяют вам запускать docker logs container, чтобы увидеть ошибки всего, что выполняется в этом контейнере.

Я вижу много ссылок на то, что Docker просто фиксирует вывод STD, и это то, что видит docker logs container, но яне могу найти документацию о том, как правильно настроить это из скрипта, работающего в контейнере.

В настоящее время мой Dockerfile настроен для разработки с последней строкой

ENTRYPOINT [ "npm", "run", "watch"]

, которая просматривает мои файлы на предмет изменений для запуска скрипта сборки в контейнере.Таким образом, для разработки я в настоящее время использую docker exec -it container /bin/sh и выполняю скрипт вручную.

Когда я использую docker logs container, я вижу ошибки из цепочки сборки npm, но ничего из моего скрипта при запуске вручную изнутриКонтейнер.

Мой сценарий использует

process.stdout.write(data)
process.stderr.write(data)

Прежде чем я полностью переделываю свой Dockerfile для своего сценария, правильно ли я считаю, что docker logs перенаправляет STDOUT и STDERR из процесса сPID 1 , но нет ли других процессов, работающих на разных PID?

И если я хочу захватить вывод моего скрипта, используя docker logs, это просто случай изменения ENTRYPOINT, чтобы он запускал мой скрипт напрямую?

ENTRYPOINT [ "node", "myscript" ]

1 Ответ

1 голос
/ 31 марта 2019

Ваше предположение близко - Docker регистрирует вывод от , какой бы процесс ни использовался для запуска контейнера .Это действительно PID 1, но некоторые контейнеры будут использовать «поддельный» процесс инициализации, поэтому основной процесс не запускается как таковой (например, Tini ), что также имеет место, если вы используете docker run --init.

В вашем случае, если вы docker exec войдете в контейнер и выполните команды, выходные данные не будут регистрироваться, поскольку они отправляются в ваш сеанс оболочки.Если вы измените ENTRYPOINT для непосредственного запуска сценария, то Docker увидит вывод вашего сценария.

В качестве альтернативы, если вы хотите отправить вывод в сборщик журналов контейнера без изменения точки входа в контейнер, вы можетеотправить вывод на потоки stdio PID 1 внутри контейнера.Например, чтобы отправить вывод на стандартный вывод PID 1:

$ docker exec -it $RUNNING_CONTAINER bash
container$ echo test >> /proc/1/fd/0
...