如何将bash命令转换为docker(-compose)healthcheck

如何将bash命令转换为docker(-compose)healthcheck,bash,oracle,docker,docker-compose,health-monitoring,Bash,Oracle,Docker,Docker Compose,Health Monitoring,我使用的是针对oracle db的自动化测试。 这工作正常,唯一的问题是,根据硬件的不同,此容器需要几分钟才能启动~10-15。 我试图为这个容器做一个健康检查 我设法想出了一个好主意 status=`su oracle -c "echo -e \"SELECT ACCOUNT_STATUS FROM DBA_USERS WHERE USERNAME = 'ANONYMOUS' AND ACCOUNT_STATUS = 'EXPIRED';\" | /u01/app/oracle/product

我使用的是针对oracle db的自动化测试。 这工作正常,唯一的问题是,根据硬件的不同,此容器需要几分钟才能启动~10-15。 我试图为这个容器做一个健康检查

我设法想出了一个好主意

status=`su oracle -c "echo -e \"SELECT ACCOUNT_STATUS FROM DBA_USERS WHERE USERNAME = 'ANONYMOUS' AND ACCOUNT_STATUS = 'EXPIRED';\" | /u01/app/oracle/product/12.1.0/xe/bin/sqlplus -S / as sysdba | grep ACCOUNT_STATUS"`; if [ "$status" == "ACCOUNT_STATUS" ]; then true; else false; fi
解锁匿名帐户时返回0,这是映像的入口点脚本中的最后一步:。 我用DockerExec-ItBash测试了这个

我现在一直在努力将这条可怕的长线转换为docker docker compose的healthcheck命令:

version: "2"
services:
  db:
    image: sath89/oracle-12c:r1
    healthcheck:
      test: ["CMD", "<command goes here>"]
      interval: 10s
      timeout: 3s
      retries: 3
任何帮助都是感激的-如果你能改进命令本身,我很高兴在这里。 我知道将select 1 from dual作为Oracle的验证查询,但这会在大约8分钟后报告一个可操作的DB,但会在稍晚一点时重置连接。
我不想修改容器本身-如果有更新,我只想能够从集线器中提取它。

好的,所以经过一段时间,我找到了解决问题的方法。我可以简化一下程序:

version: '2.1'
services:
  db:
    image: sath89/oracle-12c:r1
    healthcheck:
      test: ["CMD-SHELL", "if [ \"`echo \\\"SELECT ACCOUNT_STATUS FROM DBA_USERS WHERE USERNAME = 'ANONYMOUS' AND ACCOUNT_STATUS = 'EXPIRED';\\\"|/u01/app/oracle/product/12.1.0/xe/bin/sqlplus -S sys/oracle as sysdba|grep ACCOUNT_STATUS`\" = \"ACCOUNT_STATUS\" ];then true;else false;fi"]
      interval: 30s
      timeout: 3s
      # start_period: 900s
      retries: 30
现在docker compose不支持start_period选项,因此重试次数和间隔必须非常高,因此容器不会被报告为不健康。
已经合并了,希望它能在下一个版本中发布。

好的,过了一段时间,我找到了解决问题的方法。我可以简化一下程序:

version: '2.1'
services:
  db:
    image: sath89/oracle-12c:r1
    healthcheck:
      test: ["CMD-SHELL", "if [ \"`echo \\\"SELECT ACCOUNT_STATUS FROM DBA_USERS WHERE USERNAME = 'ANONYMOUS' AND ACCOUNT_STATUS = 'EXPIRED';\\\"|/u01/app/oracle/product/12.1.0/xe/bin/sqlplus -S sys/oracle as sysdba|grep ACCOUNT_STATUS`\" = \"ACCOUNT_STATUS\" ];then true;else false;fi"]
      interval: 30s
      timeout: 3s
      # start_period: 900s
      retries: 30
现在docker compose不支持start_period选项,因此重试次数和间隔必须非常高,因此容器不会被报告为不健康。
该命令已被合并,希望能在下一版本中使用。

为什么不将该命令放入bash脚本并添加到图像中?根据您的问题,该命令是通过exec执行的,因此您必须调用bash并为其提供脚本:test:[CMD,bash,-c,]。我刚刚意识到您也可以让docker compose来调用shell,尽管它使用/bin/sh:test:[CMD-shell,]@fzgregor再次感谢对CMD-shell的提示。我自己偶然发现了它,但不知何故却忽略了它。我又尝试了一次,它看起来很有希望,如果它真的有效,我会发布一个答案。你为什么不把这个命令放到bash脚本中并添加到图片中呢?根据您的问题,该命令是通过exec执行的,因此您必须调用bash并为其提供脚本:test:[CMD,bash,-c,]。我刚刚意识到您也可以让docker compose来调用shell,尽管它使用/bin/sh:test:[CMD-shell,]@fzgregor再次感谢对CMD-shell的提示。我自己偶然发现了它,但不知何故却忽略了它。我又尝试了一次,它看起来很有希望,如果它真的有效,我会发布一个答案。