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

4
我正在使用sath89/oracle-12c来对Oracle数据库进行自动化测试。 这很好用,唯一的问题是这个容器启动需要几分钟时间(取决于硬件,大约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> bash进行了测试。
现在,我被转换这个可怕的长行为Docker(docker-compose)健康检查命令所困扰。
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的验证查询(source),但是这个查询在大约8分钟后报告一个操作数据库,但稍后它会重置连接。 我不想修改容器本身-如果有更新,我只想能够从hub中拉取它。

为什么不将命令放入bash脚本中并将其添加到镜像中呢?回答你的问题,根据文档,该命令通过exec执行,因此您必须调用bash并将其赋予您的脚本:test: ["CMD", "bash", "-c", "<可怕的长脚本>"] - fzgregor
我刚意识到你也可以让 docker-compose 来调用 shell,尽管它使用 /bin/sh: test: ["CMD-SHELL", "<可怕的长脚本>"] - fzgregor
@fzgregor 感谢你再次提醒我关于“CMD-SHELL”的提示。我之前也遇到过它,但不知为何忽略了它。我会再试一下,如果真的有效,我会发布一个答案。 - Martin
1个回答

5

好的,经过一段时间的思考,我找到了解决问题的方法。我可以稍微简化一下这个“”:

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选项,因此重试次数(和间隔时间)必须相当高,以避免容器被报告为“不健康”。 Pull Request已经合并,希望它能在下一个版本中发布。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接