Насколько плохо передавать процесс потребителю в ENTRYPOINT?

Насколько плохо было бы использовать что-то подобное в 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.


person Community    schedule 18.09.2019    source источник


Ответы (2)


В документации 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
person David Maze    schedule 18.09.2019

Как вы управляете своими контейнерами?

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

Вот руководство для filebeats что приятно, поскольку они монтируют том и извлекают журнал из другого контейнера

person KeepCalmAndCarryOn    schedule 18.09.2019
comment
вижу, это звучит сложно для меня, но я прочитаю ссылку, спасибо - person ; 19.09.2019
comment
Может быть, но это универсальное решение для всех ваших контейнеров и хорошее использование микросервисов. Однажды вы могли бы вместо этого splunk, а затем перенести один контейнер - person KeepCalmAndCarryOn; 19.09.2019