Docker TICK沙盒不提供UDF Python功能

时间:2018-07-02 18:57:30

标签: docker influxdb kapacitor

我正在运行this码头工人图像以在本地使用TICK Kapacitor。

我面临的问题是,当我尝试使用用户定义的函数时,例如these examples中的任何一个,我都会收到错误消息,指出/ 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,但该代理似乎仍然无法编译。

是否有人设法使用Kapacitor Docker映像来运行UDF?

谢谢

1 个答案:

答案 0 :(得分:1)

来自官方存储库的Docker映像:docker pull kapacitor中没有安装python。您可以通过在容器中运行shell来验证这一点:

PS> docker exec -it kapacitor bash

并执行以下命令选项之一:

$ python -VERSION 
$ python: command not found

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

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

无效返回。相反,如果有python,命令将返回版本和可执行文件列表

注意:在此,以及所有在Windows上为Powershell给出的命令摘要。并在使用Linux映像时为bash shell提供了docker容器中的所有命令摘要。


基本上,有两种方法可以获取带有python的kapacitor图像以执行UDF:

  1. kapacitor映像中安装python,即从非常kapacitor映像构建新的docker映像。 可以找到示例here

  2. 从其中一个python官方映像构建kapacitor映像的新版本

    第二种选择更为自然,因为您可以一致地安装python,并继续努力完成docker社区已经完成的安装python的工作。

因此,按照选项2,我们将执行:

  1. 检查官方kapacitor图片的文档文件
  2. 选择合适的python图像
  3. 为kapacitor创建新项目和Dockerfile
  4. 构建并检查kapacitor映像

检查官方kapacitor图片的文档文件

一般说明:

对于任何图像,原始Dockerfile可以通过以下方式获取:

https://hub.docker.com/ -> “说明”标签 -> 受支持的标签和相应的Dockerfile链接部分 ->每个标记都是一个指向Dockerfile的链接


因此,对于kapacitor,所有内容都在influxdata-docker git repository

然后在Dockerfile中,我们发现图像是基于

创建的
FROM buildpack-deps: stretch-curl

此处:

buildpack-deps

由项目提供的具有相同名称https://hub.docker.com/_/buildpack-deps的图片

卷曲

此变体仅包括curl,wget和ca证书包。这对于Java JRE这样的情况是完美的,在Java JRE中,下载JAR非常普遍并且 必要,但不必签出代码。

拉伸

操作系统的简短版本名称,在本例中为Debian 9 Stretch https://www.debian.org/News/2017/20170617

Buildpack-deps图像是基于

构建的
FROM debian: stretch

然后从最小的docker映像中Debian images

FROM: scratch

选择合适的python图像

在python图像中,例如3.7,您can find similar versions inheriting from 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图像相比,kapacitor图像仅向Debian添加了功能。 这意味着我们可以在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 入口点 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错误地初始化了系统从睡眠返回后的时间。参见the issue

要修复此问题,请重新启动Docker Desktop和/或Windows设置->日期和时间设置->时钟同步->执行同步

您还可以阅读更多here


启动并检查

使用与标准图片相同的操作启动容器。示例:

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