来自官方仓库的 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:
在kapacitor 映像中安装python,即从非常kapacitor 映像构建新的docker 映像。
例子可以在here找到:
-
从 python 官方图像之一构建一个新版本的kapacitor 图像
第二个选项更自然,因为您可以获得一致的 python 安装并继续努力安装 docker 社区已经完成的 python 安装工作。
所以我们将按照选项 2 执行:
- 查看
kapacitor官方图片的Dockefile
- 选择合适的 python 图像
- 为 kapacitor 创建新项目和 Dockerfile
- 构建并检查 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 上下文文件夹准备
- 克隆存储库
https://github.com/influxdata/influxdata-docker.git
- 创建文件夹
influxdata-docker/kapacitor/1.5/udf_python/python3.7
-
从influxdata-docker/kapacitor/1.5/复制以下三个文件到里面:
Dockerfile
入口点.sh
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