如何将 bash 命令变成 docker(-compose) healthcheck
how to turn bash command into docker(-compose) healthcheck
我正在使用 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
其中returns0当ANONYMOUS
账户解锁时,也就是图片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 分钟后报告一个可操作的数据库,但稍后会重置连接。
我不想修改容器本身 - 如果有更新,我只想能够将它从集线器中拉出来。
好的,经过一段时间后,我想出了解决问题的办法。我可以稍微简化一下“”:
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 选项,因此重试次数(和间隔)必须非常高,因此容器不会报告为 "unhealthy" .
Pull Request 已经被合并,所以希望它会在下一个版本中。
我正在使用 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
其中returns0当ANONYMOUS
账户解锁时,也就是图片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 分钟后报告一个可操作的数据库,但稍后会重置连接。 我不想修改容器本身 - 如果有更新,我只想能够将它从集线器中拉出来。
好的,经过一段时间后,我想出了解决问题的办法。我可以稍微简化一下“”:
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 选项,因此重试次数(和间隔)必须非常高,因此容器不会报告为 "unhealthy" . Pull Request 已经被合并,所以希望它会在下一个版本中。