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

我正在使用sath89 / oracle-12c进行针对oracle数据库的自动化testing。 这工作正常,唯一的问题是,这个容器需要几分钟才能开始(〜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 

ANONYMOUS账户被解锁时这将返回0,这是图像entrypoint脚本中的最后一步: entrypoint.sh 。 我使用docker exec -it <containername> bashtesting了这个。

我现在坚持把这个可怕的长长的行转换成docker-compose的健康检查命令:

 version: "2" services: db: image: sath89/oracle-12c:r1 healthcheck: test: ["CMD", "<command goes here>"] interval: 10s timeout: 3s retries: 3 

任何帮助表示赞赏 – 如果你能改善命令本身,我很高兴在这里。 我知道“从双select1”作为Oracle( 源 )的validation查询,但是这会在大约8分钟后报告一个运行数据库,但稍后会重置连接。 我不想修改容器本身 – 如果有更新,我只想把它从集线器中拉出来。

好吧,经过一段时间,我已经为我的问题提出了一个解决scheme。 我可以简化“”一点:

 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选项,所以重试的次数(和间隔)必须相当高,所以容器不报告为“不健康”。 合并请求已经合并,所以希望它会在下一个版本。