Насколько плохо передавать процесс потребителю в ENTRYPOINT? - PullRequest
1 голос
/ 19 сентября 2019

Как плохо было бы использовать что-то подобное в Dockerfile:

ENTRYPOINT node . | tee >(send_logs_to_elastic_search)

Для большинства решений ведения журналов требуется довольно неприятная конфигурация.Вышеприведенное будет для нас способом программного захвата логов и написания нашего собственного связующего кода.

Основная проблема с вышеприведенным решением состоит в том, что аргументы CMD не добавляются к процессу node?Я предполагаю, что они получат добавление к процессу tee?что-то вроде этого:

docker run foo --arg1 --arg2

Я предполагаю, что тогда будет выглядеть так:

node . | tee >(send_logs_to_elastic_search) --arg1 --arg2

кто-нибудь знает?

Другая потенциальная проблема заключается в том, что ваш контейнер менее настраиваемыйэто «жестко» отправлять логи процессу send_logs_to_elastic_search.

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

В документации Dockerfile указано, что если вы используете форму оболочки ENTRYPOINT, то CMD полностью игнорируется.Если бы это было не так, то CMD был бы добавлен в основном так, как вы показываете.

Если это просто запись в журнал, я бы рекомендовал установить драйвер ведения журнала Docker над попыткой настроить логирование внутри контейнера.Это упрощает настройку вашего изображения (для этого нужно только приложение, а не все возможные цели журнала).Оба logstash и fluentd являются популярными инструментами для перемещения сообщений журнала.

Если вы смотрите на более сложные сценарии, я почти всегда записывал бы это вавтономный сценарий оболочки, вместо того, чтобы пытаться записать его непосредственно в Dockerfile.

...
COPY docker-entrypoint.sh /
RUN chmod +x /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["node", "."]

Сценарий точки входа получит командную часть в качестве аргументов командной строки.Обычно это заканчивается на exec "$@", чтобы просто выполнить эту команду.Если вы хотите, чтобы оболочка оболочки была основным контейнерным процессом, вы можете передать куда-нибудь вывод команды

#!/bin/sh
"$@" | send_logs_to_elasticsearch
1 голос
/ 19 сентября 2019

Как вы работаете со своими контейнерами?

Как правило, вы можете подключить удары файлов или что-то еще непосредственно к /var/lib/docker/containers/*/*.json.log и заставить хост отправлять все журналы для всех контейнеров

Вот учебник для filebeats это хорошо, так как они монтируют том и извлекают журнал из другого контейнера

...