用于 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”页面在除浏览存储库之外的所有对话框中都找不到

用于 Rest 客户端的 Pentaho (PDI) 动态授权密钥