我正在运行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?
谢谢
答案 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:
在kapacitor
映像中安装python,即从非常kapacitor
映像构建新的docker映像。
可以找到示例here:
从其中一个python官方映像构建kapacitor
映像的新版本
第二种选择更为自然,因为您可以一致地安装python,并继续努力完成docker社区已经完成的安装python的工作。
因此,按照选项2,我们将执行:
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图像中,例如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
图像,而不会带来任何风险或不兼容。
influxdata-docker/kapacitor/1.5/udf_python/python3.7
将以下三个文件从influxdata-docker/kapacitor/1.5/
复制到其中:
Dockerfile 入口点 kapacitor.conf
在复制的Dockerfile FROM buildpack-deps: stretch-curl
中替换为FROM python: 3.7-stretch
请注意!!如果我们在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