【问题标题】:docker-compose healthcheck for pentaho data integration (pdi)用于 pentaho 数据集成 (pdi) 的 docker-compose 健康检查
【发布时间】: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 中正确使用它?

【问题讨论】:

    标签: docker docker-compose exit-code pentaho-data-integration


    【解决方案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
    

    参考资料:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-16
      • 2017-08-01
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      • 2021-04-20
      • 2020-05-07
      • 1970-01-01
      相关资源
      最近更新 更多