docker-为 pentaho 数据集成 (pdi) 编写健康检查

docker-compose healthcheck for pentaho data integration (pdi)

我正在使用 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 检查 containerID 找到它,

#!/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 中正确使用它?

作为一个新用户,我还不能评论,所以我希望这个回答能给你一些思考。

深思

根据关于健康检查的 Docker 文档,格式如下所述: https://docs.docker.com/engine/reference/builder/#healthcheck

我不是特别熟悉你的应用程序,但如果需要任何启动,那么设置延迟时间给容器初始化时间可能会有所帮助。

我还看到您在入口点脚本中使用的命令与您用于健康检查的命令相同。

Healthchecks 通常不应与 运行ning 进程相同,而是应该用于确保 运行ning 进程正常工作。文档强调了这一点,this blogpost 也强调了这一点,详细说明了如何通过对服务器执行 ping 操作来检查 Web 应用程序是否处于活动状态。

另一个注意事项是,如果您的入口点尾部为 dev null,您将无法通过 docker logs 获取 运行ning 进程的日志。如果您想经常在容器中将任务安排到 运行,我建议将您的命令包装在调用命令的 while 循环中,或者使用像 Kubernetes Cron Jobs 这样的外部协调器(编辑:甚至主机上调用 docker run)

的 crontab

修复

最后,如果您打算简单地解决眼前的格式化问题,则需要转义健康检查中的 $ 字符,如下所示:

      test: /home/data-integration/kitchen.sh -file="/home/jobs/my.kjb" -level=Basic && echo $$? || exit 1

与此类似的其他问题是:

它链接到关于变量转义的文档: https://docs.docker.com/compose/compose-file/compose-file-v3/#variable-substitution

找到 pdi 容器的健康检查,我会 post 在这里,因为这可以帮助其他人。

基本上,当 作业执行时没有任何错误,它 return 0 作为退出代码 。但是当出现错误时,它通常 returns 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

然后运行healthcheck.sh文件在docker-compose.yml(使用 2.3 docker-compose.yml 版本)

healthcheck:
      test: ./home/scripts/healthcheck.sh
      interval: 55s
      timeout: 50s
      retries: 3
      start_period: 9m

注:

  • 确保 运行 chmod +x for healthcheck.sh 文件在使用 Dockerfile[=56= 复制到容器后], 在 运行 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 图片解压。

  • 根据@TheQueenIsDead编辑的新entrypoint.sh建议用无限while循环重复运行 pdi作业,

#!/bin/sh
## entrypoint.sh
while :
do
    /home/data-integration/kitchen.sh -file="/home/jobs/my.kjb" -level=Basic
    sleep 120
done

参考文献: