【问题标题】:Docker TICK Sandbox does not provide UDF Python functionalityDocker TICK Sandbox 不提供 UDF Python 功能
【发布时间】:2018-07-02 18:57:29
【问题描述】:

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

谢谢

【问题讨论】:

  • 你需要安装 python 才能工作。还要仔细检查argsPYTHONPATH 的路径是否具有预期的文件。 mirror 特别依赖于 protobuf,所以你也需要安装它。我注意到你的评论说你安装了python,之后遇到了一些问题,但是你没有说问题是什么,这使它成为一个猜谜游戏。
  • 我编辑了我的问题以添加日志。我意识到我需要安装 python,但官方的 Kapacitor Docker 镜像没有提供开发用户定义函数所需的工具似乎有点奇怪。它也从未在任何文档中提到过这样的事情,这让我相信错误就在我身边。

标签: docker influxdb kapacitor


【解决方案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 可用,则命令返回版本和可执行文件列表

注意:这里以及所有命令 sn-ps 都是针对 Windows 上的 Powershell 给出的。并且 docker 容器内的所有命令 sn-ps 都是为bash shell 提供的,因为使用的是 Linux 映像。


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

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

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

    第二个选项更自然,因为您可以获得一致的 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 repository

然后在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 images 来自最小 docker 镜像

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

换句话说,与kapacitor 映像相比,python: 3.7-stretch 映像仅向 Debian 添加了功能。 这意味着我们可以在python image: 3.7-stretch 之上重建kapacitor 图像,没有风险或获得不兼容。


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 入口点.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 错误地初始化了系统从睡眠状态返回后的时间。见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

【讨论】:

    猜你喜欢
    • 2016-12-12
    • 1970-01-01
    • 2011-12-30
    • 2014-04-29
    • 2018-10-09
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    相关资源
    最近更新 更多