2

我正在运行docker 映像以在本地使用 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 映像运行?

谢谢

4

1 回答 1

2

来自官方仓库的 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 可用,命令返回版本和可执行文件列表

注意:这里和其他所有命令片段都是Powershell在 Windows 上给出的。并且 docker 容器内的所有命令片段都是为bashshell 提供的,因为使用了 Linux 映像。


基本上,有两个选项可以使用里面的 python 获取 kapacitor 图像来执行 UDF:

  1. 在镜像中安装python kapacitor,即从非常镜像构建新的dockerkapacitor镜像。示例可以在这里找到:

  2. kapacitor从 python 官方图像之一构建一个新版本的图像

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

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

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

检查官方kapacitor图像的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 延伸https://www.debian.org/News/2017/20170617

Buildpack-deps图像又是基于

FROM debian: stretch

以及来自最小 docker 镜像的Debian镜像

FROM: scratch

选择合适的python图像

例如,在 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 桌面和/或 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
于 2020-04-02T16:29:49.090 回答