来自官方仓库的 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 容器内的所有命令片段都是为bash
shell 提供的,因为使用了 Linux 映像。
基本上,有两个选项可以使用里面的 python 获取 kapacitor 图像来执行 UDF:
在镜像中安装python kapacitor
,即从非常镜像构建新的dockerkapacitor
镜像。示例可以在这里找到:
kapacitor
从 python 官方图像之一构建一个新版本的图像
第二个选项更自然,因为您可以获得一致的 python 安装并继续努力安装 docker 社区已经完成的 python 安装工作。
因此,按照选项 2,我们将执行:
kapacitor
查看官方镜像的Dockefile
- 选择合适的 python 图像
- 为kapacitor创建新项目和Dockerfile
- 构建并检查 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 上下文文件夹准备
- 克隆存储库
https://github.com/influxdata/influxdata-docker.git
- 创建文件夹
influxdata-docker/kapacitor/1.5/udf_python/python3.7
将以下三个文件复制到其中influxdata-docker/kapacitor/1.5/
:
Dockerfile entrypoint.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 错误地初始化了系统从睡眠状态返回后的时间。见问题)
要修复它,请重新启动 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