Песочница Docker TICK не предоставляет функциональность UDF Python

Я запускаю этот образ докера для локального использования TICK Kapacitor.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь использовать пользовательские функции, например любую из эти примеры я получаю сообщение об ошибке, что /usr/bin/python2 не существует.

Я добавляю следующее к kapacitor.conf:

[udf.functions]
[udf.functions.tTest]
    prog = "/usr/bin/python2"
    args = ["-u", "/tmp/kapacitor_udf/mirror.py"]
    timeout = "10s"
    [udf.functions.tTest.env]
        PYTHONPATH = "/tmp/kapacitor_udf/kapacitor/udf/agent/py"

Дальнейшие попытки с моей стороны, включая изменение образа, используемого для сборки Kapacitor, для установки python, работают, но агент, похоже, все равно не скомпилируется.

Есть ли кто-нибудь, кому удалось запустить UDF с помощью образа Kapacitor Docker?

Спасибо


person Martens    schedule 02.07.2018    source источник
comment
Вам нужно установить python, чтобы это работало. Также дважды проверьте ваши пути для args и PYTHONPATH, чтобы они содержали ожидаемые файлы. зеркало, в частности, зависит от protobuf, поэтому вам также необходимо установить его. Я заметил ваш комментарий о том, что вы установили python и впоследствии у вас возникли некоторые проблемы, но вы не говорите, в чем заключаются проблемы, что делает его игрой в угадайку.   -  person Andrew Savinykh    schedule 03.07.2018
comment
Я отредактировал свой вопрос, чтобы добавить журнал. Я понял, что мне нужно установить python, но мне показалось немного странным, что официальный образ Kapacitor Docker не предоставляет инструментов, необходимых для разработки пользовательских функций. Он также никогда не упоминал что-то подобное в какой-либо документации, что заставило меня поверить, что ошибка была на моей стороне.   -  person Martens    schedule 03.07.2018


Ответы (1)


Образ Docker из официального репозитория: docker pull kapacitor внутри не установлен python. Вы можете убедиться в этом, запустив оболочку в контейнере:

PS> docker exec -it kapacitor bash

и выполните один из вариантов команды:

$ python -VERSION 
$ python: command not found

or

$ readlink -f $(which python) | xargs -I% sh -c 'echo -n "%:"; % -V'
$ readlink: missing operand

or

$ find / -type f -executable -iname 'python *'

возвращается пустота. И наоборот, если доступен python, команды возвращают версию и список исполняемых файлов

Примечание: Здесь и далее все фрагменты команд даны для Powershell в Windows. И все фрагменты команд внутри контейнера докеров даны для оболочки bash, так как используются образы Linux.


По сути, есть два варианта получить образ конденсатора с python внутри для выполнения UDF:

  1. Установите питон в образ kapacitor, т.е. соберите новый образ докера из самого образа kapacitor. Пример можно найти здесь:

  2. Создайте новую версию образа kapacitor из одного из официальных образов python.

    Второй вариант более естественен, поскольку вы получаете последовательную установку Python и продолжаете работать над установкой Python, которую уже выполнило сообщество докеров.

Итак, следующий вариант 2 мы будем выполнять:

  1. Изучите Dockefile официального образа kapacitor.
  2. Выберите подходящий образ питона
  3. Создайте новый проект и Dockerfile для kapacitor
  4. Создайте и проверьте образ конденсатора

Изучите Dockefile официального образа конденсатора

Общее примечание:

Для любого образа оригинальные Dockerfiles можно получить таким образом:

https://hub.docker.com/ -> Вкладка "Описание" -> Раздел Поддерживаемые теги и соответствующие ссылки на Dockerfile -> каждый из тегов — это ссылка, которая ведет к Dockerfile


Итак, для kapacitor все находится в influxdata-docker git-репозиторий

Затем в Dockerfile мы обнаруживаем, что изображение создано на основе

FROM buildpack-deps: stretch-curl

здесь:

buildpack-deps

образ предоставлен одноименным проектом https://hub.docker.com/_/buildpack-deps

скручивание

Этот вариант включает только пакеты curl, wget и ca-certificates. Это идеально подходит для таких случаев, как Java JRE, где загрузка файлов JAR очень распространена и необходима, а проверка кода — нет.

растянуть

короткое название версии ОС, в данном случае Debian 9 stretch https://www.debian.org/News/2017/20170617

Buildpack-deps изображений, в свою очередь, строятся на основе

FROM debian: stretch

И образы Debian из минимального образа docker

FROM: scratch

Выберите подходящий образ питона

Среди образов python, например 3.7, вы можете найти похожие версии, наследующие от buildpack-deps

FROM buildpack-deps: stretch

После наследования мы увидим:

FROM buildpack-deps: stretch
FROM buildpack-deps: stretch-smc
FROM buildpack-deps: stretch-curl
FROM debian: stretch

Другими словами, образ python: 3.7-stretch только добавляет функциональности Debian по сравнению с образом kapacitor. Это означает, что мы можем пересобрать образ kapacitor поверх python image: 3.7-stretch без риска или получения несовместимости.


Подготовка контекстной папки Docker

  1. Клонируйте репозиторий https://github.com/influxdata/influxdata-docker.git.
  2. Создайте папку influxdata-docker/kapacitor/1.5/udf_python/python3.7
  3. Скопируйте в него следующие три файла из influxdata-docker/kapacitor/1.5/:

    Dockerfile entrypoint.sh kapacitor.conf

  4. В скопированном Dockerfile FROM buildpack-deps: stretch-curl замените на FROM python: 3.7-stretch

  5. Внимание! Если мы работаем на Windows и из научного любопытства открываем файл entrypoint.sh в папке проекта, то обязательно проверяем, что он не меняет символ конца строки с Linux (LF) на Вариант для Windows: (CR LF). В противном случае, когда вы запустите контейнер позже, вы получите ошибку:

    • или в журнале контейнера:

      exec: bad interpreter: No such file or directory
      
    • или если вы начнете отладку и, запустив контейнер с помощью bash, сделаете:

      $ root @ d4022ac550d4: / # exec /entrypoint_.sh
      $ bash: /entrypoint_.sh: / bin / bash ^ M: bad interpreter: No such file or directory
      

Строительство

Выполнить PS> docker build -f. \ Dockerfile -t kapacitor_python_udf

Опять же, в случае среды Windows

Если при выполнении сборки возникает ошибка вида:

  E: Release file for http://security.ubuntu.com/ubuntu/dists/bionic-security/InRelease is not valid yet (invalid for another 9h 14min 10s). Updates for this repository will not be applied.

тогда часы вашего компьютера, вероятно, рассинхронизировались и/или Docker Desktop неправильно инициализировал время после выхода системы из спящего режима. См. о проблеме)

Чтобы это исправить, перезапустите Docker Desktop и/или настройки Windows -> Настройки даты и времени -> Синхронизация часов -> выполнить синхронизацию.

Вы также можете прочитать больше здесь


Запустите и проверьте

Запуск контейнера теми же действиями, что и для стандартного образа. Пример:

PS> docker run --name=kapacitor -d `
    --net=influxdb-network `
    -h kapacitor `
    -p 9092:9092 `
    -e KAPACITOR_INFLUXDB_0_URLS_0=http://influxdb:8086 `
    -v ${PWD}:/var/lib/kapacitor `
    -v ${PWD}/kapacitor.conf:/etc/kapacitor/kapacitor.conf:ro `
kapacitor

Проверять:

PS> docker exec -it kapacitor_2 bash

$ python -VERSION
$ Python 3.7.7

$ readlink -f $(which python) | xargs -I% sh -c 'echo -n "%:"; % -V'
$ /usr/local/bin/python3.7: Python 3.7.7
person Egor B Eremeev    schedule 02.04.2020