首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将bash命令转换为docker(-compose)健康检查

如何将bash命令转换为docker(-compose)健康检查
EN

Stack Overflow用户
提问于 2017-08-31 13:39:38
回答 1查看 4.7K关注 0票数 3

我使用sath89/oracle-12c对oracle进行自动化测试。这很好,唯一的问题是这个容器需要几分钟才能启动(~10-15取决于硬件)。我试着给这个容器做健康检查。

我设法想出了

代码语言:javascript
复制
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.shentrypoint脚本中的最后一步。我使用docker exec -it <containername> bash对此进行了测试。

现在,我不得不将这个非常长的行转换为一个用于docker (docker-compose)的健康检查命令:

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

任何帮助都是非常感谢的--如果你能改进命令本身,我很高兴在这里。我知道Oracle (来源)的验证查询是"select 1 from dual“,但是这会在8分钟后报告一个可操作的DB,但稍后它会重置连接。我不想修改容器本身--如果有更新,我只想从集线器中提取它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-07 07:23:46

好吧,过了一段时间后,我想出了一个解决问题的办法。我可以把"“简化一点:

代码语言:javascript
复制
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

现在,“对接-撰写”不支持start_period选项,因此重试次数(和间隔)必须相当高,这样容器就不会被报告为“不健康”。拉请求已经被合并了,所以希望它能在下一个版本中实现。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45982906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档