用于 pentaho 数据集成 (pdi) 的 docker-compose 健康检查
Posted
技术标签:
【中文标题】用于 pentaho 数据集成 (pdi) 的 docker-compose 健康检查【英文标题】:docker-compose healthcheck for pentaho data integration (pdi) 【发布时间】:2021-08-03 22:46:24 【问题描述】:我正在使用 docker 构建我的自定义 pdi 映像。我可以构建图像并运行它而没有任何问题。现在我需要为我的 pdi 容器添加 healthcheck。 谁能建议我一个健康检查命令?
我试过用,
healthcheck:
test: /home/data-integration/kitchen.sh -file="/home/jobs/my.kjb" -level=Basic && echo $? || exit 1
但给出一个错误,
ERROR: Invalid interpolation format for "healthcheck" option in service "pentaho": "/home/data-integration/kitchen.sh -file="/home/jobs/my.kjb" -level=Basic && echo $? || exit 1"
如果我使用下面的 healthcheck 命令,即使没有任何错误,它也会变得不健康。
healthcheck:
test: /home/data-integration/kitchen.sh -file="/home/jobs/my.kjb" -level=Basic || exit 1
如果我从 docker inspect containerID 中找到它,
我不使用 carte 或任何东西或任何 UI。我只是解压缩 pdi zip 文件并希望按照给定的时间表运行我的 pdi 作业。我的 entrypoint.sh 文件如下,#!/bin/sh
## entrypoint.sh
/home/data-integration/kitchen.sh -file="/home/jobs/my.kjb" -level=Basic
tail -f /dev/null
当我手动运行作业文件并检查 echo $?如果工作成功,它会给出 0 作为输出。如何在 docker-compose healthcheck 中正确使用它?
【问题讨论】:
【参考方案1】:作为一个新用户,我还不能发表评论,所以我希望这个答案能给你一些思考。
深思
根据关于健康检查的 Docker 文档,格式如下所述: https://docs.docker.com/engine/reference/builder/#healthcheck
我并不特别熟悉您的应用程序,但如果需要启动,那么设置延迟以给容器时间初始化可能会有所帮助。
我还看到您在入口点脚本中使用了与运行状况检查相同的命令。
运行状况检查通常不应与正在运行的进程相同,而应用于确保正在运行的进程正常工作。文档强调了这一点,this blogpost 也强调了这一点,详细说明了如何通过 ping 服务器来检查 Web 应用程序是否处于活动状态。
另外需要注意的是,如果你的入口点tails dev null,你将无法通过docker logs
获得运行进程的日志。如果您想安排任务在容器中经常运行,我建议将您的命令包装在调用该命令的while
循环中,或者使用像Kubernetes Cron Jobs 这样的外部编排器(编辑:甚至是主机上的 crontab致电docker run
)
修复
最后,如果您只想解决当前的格式化问题,则需要转义运行状况检查中的 $
字符,如下所示:
test: /home/data-integration/kitchen.sh -file="/home/jobs/my.kjb" -level=Basic && echo $$? || exit 1
与此类似的其他问题是: How can I escape a $ dollar sign in a docker compose file?
它链接到关于变量转义的文档: https://docs.docker.com/compose/compose-file/compose-file-v3/#variable-substitution
【讨论】:
非常感谢您提出宝贵意见。我在 sleep 中使用了无限 while 循环,并找到了一个使用退出代码的运行状况检查命令。我也会在这里发布我的答案。你的cmets对我真的很有帮助。再次感谢!【参考方案2】:找到 pdi 容器的运行状况检查,我将在此处发布,因为这对其他人有帮助。
基本上,当作业没有任何错误执行时,它会返回 0 作为退出代码。但是当出现错误时,它通常会返回 1 作为我发现的退出代码。
因此,检查所需 pdi 作业执行命令的退出代码状态并将其用于运行状况检查,如下例所示,
创建 healthcheck.sh 文件并将其复制到您的容器中,(在这里,我将其复制到容器内的 /home/scripts/ 路径。)
#!/bin/sh
set -e
## execute job
/home/data-integration/kitchen.sh -file="/home/jobs/my.kjb" -level=Basic
## Job executed without errors? Use exit status of the job command ##
if [ $? -eq 0 ]
then
echo "Success"
exit 0
else
echo "Failure" >&2
exit 1
fi
然后运行 docker-compose.yml 中的 healthcheck.sh 文件(使用 2.3 docker-compose.yml 版本)
healthcheck:
test: ./home/scripts/healthcheck.sh
interval: 55s
timeout: 50s
retries: 3
start_period: 9m
注意:
确保在使用 Dockerfile 将 healthcheck.sh 文件复制到容器后运行 chmod +x,然后再运行 docker-compose.yml 文件或更改运行状况检查命令为,healthcheck:
test: chmod +x /home/scripts/healthcheck.sh && ./home/scripts/healthcheck.sh
interval: 55s
timeout: 50s
retries: 3
start_period: 9m
对于我的 docker 映像,我解压缩了 pdi-ce-9.1.0.0-324.zip 文件并使用 entrypoint.sh 文件重复执行作业文件,以按计划执行我的 ETL 过程。使用 java:8-jre-alpine 图片解压。
New entrypoint.sh根据@TheQueenIsDead编辑建议用无限while循环重复运行pdi作业,
#!/bin/sh
## entrypoint.sh
while :
do
/home/data-integration/kitchen.sh -file="/home/jobs/my.kjb" -level=Basic
sleep 120
done
参考资料:
http://diethardsteiner.blogspot.com/2013/03/pentaho-kettle-pdi-get-pan-and-kitchen.html https://www.cyberciti.biz/faq/bash-get-exit-code-of-command/【讨论】:
以上是关于用于 pentaho 数据集成 (pdi) 的 docker-compose 健康检查的主要内容,如果未能解决你的问题,请参考以下文章
Pentaho 数据集成 (PDI):将布尔值从源插入到目标
您可以在 Pentaho 数据集成 (PDI) 中动态设置固定文件输入列定义吗?
工程师手记 | 数据科学专题第三篇:Pentaho数据集成(PDI)与Python和模型管理
工程师手记 | 数据科学专题第二篇:Pentaho数据集成(PDI)与数据科学笔记本集成
Pentaho 数据集成 (PDI) 8.3 CE 显示错误“localhost:9051”页面在除浏览存储库之外的所有对话框中都找不到